JavaScript学习笔记--JS高级(尚硅谷)

一、基础总结深入

1.1 数据类型

1.基本(值)类型

  1. String:任意字符串
  2. Number:任意的数字
  3. boolean:true/false
  4. undefined:undefined
  5. null:null

2.对象(引用)类型

  1. Object:任意对象
  2. Function:一种特别的对象(可以执行)
  3. Array:一种特别的对象(数值下标属性,内部数据是有序的)

3.判断数据类型方式

1.typeof   

 返回数据类型的字符串表达                                                                                                             

 * 可以判断:undefined / 数值 / 字符串 / 布尔值 / function                                                               

 * 不能判断:null 与 object   object 与 array   

2.instanceof(哪个类型的实例) :判断对象的具体类型(一个函数/数组等等)

3.  === / ==                                                                                                                                        

 * 可以判断:undefined  /  null 

typeof 返回数据类型的字符串表达

<script>
        var a;
        console.log(a,typeof a,typeof a === 'undefined',a === undefined); //输出结果:undefined  'undefined' true true
        a = 3;
        console.log(typeof a === 'number'); //true
        a = 'abcdefg';
        console.log(typeof a === 'string'); //true
        a = true;
        console.log(typeof a === 'boolean'); //true
        a = null;
        console.log(typeof a );  //object
    </script>

 对象

<body>
    <script>
        //typeof判断数值类型
        var a;
        console.log(a,typeof a,typeof a === 'undefined',a === undefined); //输出结果:undefined  'undefined' true true
        a = 3;
        console.log(typeof a === 'number'); //true
        a = 'abcdefg';
        console.log(typeof a === 'string'); //true
        a = true;
        console.log(typeof a === 'boolean'); //true
        a = null;
        console.log(typeof a );  //object

        //2.对象
        var b1 = {
            b2:[1,'abc',console.log],
            b3:function(){
                return 'xfzhang';
            }
        }
        console.log(b1 instanceof Object,b1 instanceof Array); //true  false
        console.log(b1.b2 instanceof Array,b1.b2 instanceof Object);//true  true
        console.log(b1.b3 instanceof Function,b1.b3 instanceof Object);//true true
        console.log(typeof b1.b2);//'object'

        console.log(typeof b1.b3 === Function);//true

        console.log(typeof b1.b2[2]);//function
        b1.b2[2](4);
        console.log(b1.b3()());
    </script>

实例对象 

 <script>
        //实例:实例对象
        //类型:类型对象
        function Person(name,age){ //构造函数类型
            this.name = name;
            this.age = age;
        }
        var p = new Person('Tom',12);//根据类型创建的实例对象
        //Person('Jack',12);//不能这样子调用
    </script>

⭐1.undefined和null的区别

答: undefined代表定义了未赋值

        null代表定义并赋值了,只是值为null。

 //1.undefined 和 null的区别
        var a;
        console.log(a);  //undefined
        a = null;
        console.log(a);  //null

 ⭐2.什么时候给变量赋值为null呢

答:

  1. 初始赋值,表明变量要赋值为对象
  2. 结束前,让对象成为垃圾对象(被垃圾回收站回收)
//起始
var b = null; //初始赋值为null,表明将要赋值为对象
//确定对象赋值
b = ['aaa',12];
//最后   释放数组所占用的内存
b = null;    //让b指向的对象成为垃圾对象(被垃圾回收器(在浏览器内核中)回收)

 ⭐3.严格区分变量类型与数据类型

答:

数据的类型:

  • 基本类型 
  • 引用类型

 

变量的类型(变量内存值的类型):

  • 基本类型:保存的就是基本类型数据
  • 引用类型:保存的是地址值
 var c = function(){}  //保存的是function的地址值
 console.log(typeof c); //function

1.2 数据_变量_内存 

1.什么是数据? 

答:存储在内存中代表特定信息的东西,本质上是0101....(二进制数据)

         数据的特点:可传递,可运算

          一切皆数据

          内存中所有操作的目标是数据

  • 算术运算
  • 逻辑运算
  • 赋值
  • 运行函数

2.什么是内存?                                                                                                                 

 答:内存条通电以后产生的可存储数据的空间(临时的)

        内存产生和死亡:内存条(电路板)==>  产生内存空间 ==> 存储空间 ==> 存储数据 ==> 处理数据 ==> 断电 ==> 内存空间和数据都消失

         一块小内存的两个数据:1.内部存储的数据  2.地址值

         内存分类:栈:存储基本数据类型(全局变量和局部变量)

                           堆:对象(对象本身在堆空间,标识这个对象的变量在栈空间)                   

3.什么是变量       

 答:可变化的量,由变量名和变量值组成

  每个变量都对应的一小块内存,变量名用来查找对应的内存,变量值就是内存中保存的数据

4.内存,数据,变量三者之间的关系

答:内存是用来存储数据的空间,

  变量是内存的标识。

var obj = {name:'Tom'}

obj  --  变量(存储在栈空间中)

name:'Tom'  -- 数据(存储在堆空间中)

这个等式的意思:将数据的地址值赋值给变量。

var a = obj;

 在堆空间中开辟出一块地址a,将obj空间存储的地址值拷贝给a一份

console.log(obj.name);

 内存是根据名称来查找的,此代码的意思是根据obj查找存储的地址值,在堆空间中找到对应数据

'.'   ---- 只有当变量中存储的是地址值才能加  '.'     ,然后读内存里面的值

任何内存都有地址值,只是使用还是不使用的区别。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5qyn5rOh5p6c5aW2Tw==,size_20,color_FFFFFF,t_70,g_se,x_16

 5.关于赋值与内存的问题

问题:var a = xxx ,a 内存中保存的到底是什么?

 答:* xxx 是基本数据,保存的就是这个数据

        *  xxx是对象,保存的是对象的地址值

        *  xxx是一个变量,保存的是xxx的内存内容(可能是基本数据,也可能是地址值)

6.关于引用变量赋值的问题 

答:* 多个引用变量指向同一个对象 ,通过一个变量修改对象内部数据,另一个变量看到的是修改之后的数据。

       *两个引用变量指向同一个对象,让其中一个引用变量指向另一个对象,另一个引用变量依然指向前一个对象

<script>
        var obj1 = {name:'Tom'}
        var obj2 = obj1;
        obj2.age = 12;
        console.log(obj1.age);
        function fn(obj){   //obj形参
            obj.name = 'A';
        }
        fn(obj1);   //obj1实参
        console.log(obj2.name);//A
</script>
  var a = {age:12};
        var b = a;
        a = {name:'Bob',age:13}
        console.log(b.age,a.name,a.age);//12 Bob 13

        function fn2(obj){  
             //这里的obj传入的是实参a的地址值,但是obj在函数中重新赋值了一个地址值
             //相当于obj是一个新的对象,与a没有关系了
            obj = {age:15}
        }
        fn2(a);
        // obj在执行完之后会成为垃圾对象,因为执行完之后,函数内部的局部变量会被自动释放
        console.log(a.age);//13

7.关于数据传递问题 

 答:* 理解1:都是值(基本/地址值)传递

        * 理解2:可能是值传递,也可能是引用传递(地址值) 

8.JS引擎如何管理内存 

答:1.内存生命周期 

           * 分配小内存空间,得到它的使用权 

           * 存储数据,可以反复进行操作

           * 释放小内存空间  

       2.释放内存 

           * 局部变量: 函数执行完自动释放

           * 对象 : 成为垃圾对象==>垃圾回收器回收

1.3 对象 

1.什么是对象?

答:* 多个数据的封装体

       * 用来保存多个数据的容器

       * 一个对象代表现实世界中的一个事物 

2.为什么要用对象?

答:统一管理多个数据 。

3.对象的组成

答: * 属性:属性名(字符串)和属性值(任意)组成

         * 方法:一种特别的属性

4.如何访问对象内部数据? 

答:* .属性名 :编码简单,有时不能用

       * ['属性名']:编码麻烦,能通用

什么时候必须使用['属性名']的方式? 

答:1.属性名包含特殊字符:- 空格 

       2.变量名不确定 

<script type="text/javascript">
        var p = {};
        //1.给p对象添加一个属性:content-type:text/json
        // p.content-type = 'text/json';   //不能用
        p['content-type'] = 'text/json';
        console.log(p['content-type']);

        //2.变量名不确定
        var propName = 'myAge';
        var value = 18;
        // p.propName = value//不能用
        p[propName] = value;
        console.log(p[propName]);
    </script>

 1.4 函数

1.什么是函数?

答:*  实现特定功能的n条语句的封装体

       *  只有函数是可以执行的,其他类型的数据不能执行 

2.为什么要用函数? 

答:*  提高代码复用 

       *  便于阅读交流 

3.如何定义函数? 

答:* 函数声明 

       * 表达式 

function fn1(){//函数声明
            console.log('fn1()');
        }
        var fn2 = function(){//表达式
            console.log(fn2);
        }

4.如何调用(执行函数)? 

答: * test():直接调用

        * obj. test(): 通过对象调用

        * new test() : new调用

        * test.call/apply(obj) : 临时让test成为obj的方法进行调用

 var obj = { }
            function test2 (){
                this.xxx = 'atguigu';
            }
        // obj.test2();
        test2.call(obj);//obj.test2   //可以让一个函数成为指定任意对象的方法进行调用
        console.log(obj.xxx);

 1.5 回调函数

1.什么样的函数才是回调函数?

答:1.你定义的    2.你自己没有调用   3.最终它执行了 

2.常见的回调函数 

答:* DOM事件回调函数

       * 定时器回调函数

       * ajax请求回调函数(后面讲) 

       * 生命周期回调函数(后面讲)

<body>
    <button id='btn'>测试点击事件</button>
    <!-- 1.什么函数才是回调函数
    2.常见的回调函数 -->
    <script>
     document.getElementById('btn').onclick = function(){//dom事件回调函数
         alert(this.innerHTML)
     }
     //定时器
     //超时定时器(延时定时器)
     //循环定时器
     setTimeout(function(){//定时器回调函数
         alert('到点了')
     },2000)
    </script>
</body>

 1.6 IIFE

1.理解

全称:Immediately-Invoked Function Express 

2.作用 

答:* 隐藏实现 

       * 不会污染外部命名空间 

   <script>
       var fn = function(){
            console.log('....');
        }
        (function(){  //匿名函数自调用
            console.log('....');
        })()

        var a = 4;
        console.log(a);

        (function(){
            var a = 1;
            function test(){
                console.log(++a);
            }
            function test2(){

            }
            window.$ = function(){//向外暴漏一个全局函数
                return {
                    test:test
                }
            }
        })()
        $().test();//1.$是一个函数   2.$符执行后返回的是一个对象
    </script>

1.7 函数中的this 

1.this是什么?

答: * 所有函数内部都有一个变量叫this

        * 它的值是调用函数的当前对象 

        * 任何函数本质上都是通过某个对象来调用的,如果没有直接指定,就是window

2. 如何确定this的值?

答:* test():window 

       * p.test() : p

       * new test() : 新创建的对象 

       * p.call(obj):obj 

   <script>
        //谁调用的this,this就指向谁
        function Person(color){
            console.log(this);
            this.color = color;
            this.getColor = function(){
                return this.color;
            };
            this.setColor = function(){
                this.color = color;
            };
        }
        Person("red");//this是谁?     window

        var p = new Person("yello");//this是谁?  p

        p.getColor();//this是谁?  p

        var obj = {};
        p.setColor.call(obj,"black");//this是谁?  obj

        var test = p.setColor;
        test();//this是谁? window 

        function fun1(){
            function fun2(){
                console.log(this);
            }
            fun2();//this是谁? window
        }
    </script>

补充:分号问题 

  1. js一条语句的后面可以不加分号 
  2. 是否加分号是编码风格问题 ,没有应不应该,只有喜不喜欢
  3. 在下面两种情况下不加分号会有问题  1.小括号开头的前一条语句  2.中方括号开头的前一条语句
  4. 解决办法:在行首加分号
  5. 强有力的例子:vue.js 

二、函数高级

 2.1 原型与原型链

 1.函数的prototype属性(图)

 * 每个函数都有一个prototype属性,它默认指向一个Object空对象(即称为:原型对象)

 * 原型对象中有一个属性constructor,它指向函数对象 

2.给原型对象添加属性(一般都是方法) 

* 作用:函数的所有实例对象自动拥有原型中的属性(方法)

 

 

听到这不太能听得懂这个老师讲的课了,,还是去看pink老师接下来的教程了,以后回过头再继续看看这个老师讲的课也许会有新的收获。 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值