javascript基础学习四

回顾:
1、面向对象的角度 a) 什么是面向对象 b) 什么是面向过程 c) 什么是面向对象开发,面向过程开发 2、调试工具的使用(查看DOM方法) 3、数据的内存结构(*) 4、基本类型和复杂类型的变量存储结构   空对象,存储特点是只有变量没有对象数据,但有对象方法等

值类型与引用类型

  1、内存逻辑结构(画图)

  2、赋值方式

    a) 值类型赋值的存储特点,将变量内的数据全部拷贝一份,存储给新的变量

    b) 其特点是在内存中有两个数据副本

引用类型赋值

赋值就是将栈中存储数据拷贝,然后将数据赋值给obj

内存中有1份数据。

问题:利用obj修改的name会影响到原来的

1、深拷贝与浅拷贝

如果拷贝的时候,将数据的所有引用结构都拷贝一份,数据在内存中独立就是深拷贝

如果,只针对当前的对象属性进行拷贝,那么就是浅拷贝

拷贝:复制一份,指将对象的数据复制

在讨论的时候一定要保证对象的属性也是引用类型

        //浅拷贝代码
          var pCopy = {};
        pCopy.name = p.name;
        pCopy.age = p.age;
        pCopy.car = p.car;        //引用类型是浅拷贝时没有拷贝对象,指向一个对象存储空间
        
        //深拷贝代码
        var pCopy = {};
        pCopy.name = p.name;
        pCopy.age = p.age;
        pCopy.car = {};//深拷贝时,开辟新空间使得数据独立
        pCopy.car.name = p.car.name;        

2、代码的封装

  a) 利用面向对象的思想,一般会让对象带有一个copy的方法,来完成自己的拷贝

  b) 如果需要将一个对象封装成浅拷贝

  c) this在函数(方法)内部,表示调用该函数的对象

//浅拷贝代码
     var p = {
           name : 'zs',
           age : 19,
           gender : '男',
           copy : function () {
               var temp = {};
               for (var k in this) {
                   temp[ k ] = this[ k ]; 
               }
               return temp;
           }
       };
        var p2 = p.copy();
        p.name = '李四';
        p.age = 20;
        p.gender = '女';
          
 //深拷贝代码
        //需要保证所有的对象中都有copy方法,那么就可以简化了
        var deepCopy = function () {
            //1、创建一个对象
            var temp = {};
            //2、拷贝属性,在判断如果是引用类型需要深拷贝
            for ( var k in this) {
                if (typeof this [k] == 'object' ){
                    temp[k] = this[k].deepCopy();
                }else {
                    temp[k] = this[k];
                }
            }
            return temp;
        }
        
        var car = {name : '法拉利',};
        var p = { name :'账单',
                car : car
                };
        car.deepCopy = deepCopy;
        p.deepCopy = deepCopy;
 
        var newP = p.deepCopy();
        p.name = 'sjdhsas';
        p.car.name = 'lbjn';

总结:深拷贝浅拷贝在拷贝引用类型时有区别。

面试题

1、onload jq read 的区别

a) onload时表示所有东西加载完成(如图片等)read 加载完成DOM树就可以

2、类型转换(注意:在js中唯一一个自己不等于自己NaN

创建对象的过程

1、代码: var p = new person();
2、首先运算符new创建了一个对象,类似于{ }是一个没有(任何自定义成员)的对象   a) 使用new创建对象,对象的类型就是创建他的构造函数名(person)   b) 使用{},创建的是object,相当于new object()
3、然后调用构造函数为其初始化成员   a) 构造函数在调用的一开始,有一个赋值操作,即this = 刚刚创建出来的对象   b) 因此在构造函数中this表示刚刚创建出来的对象
4、在构造函数中,利用对象的动态特性为对象添加成员   1、onload 与 jq 中 read 的区别     a) onload时表示所有东西加载完成(如图片等)read 加载完成DOM树就可以   2、类型转换(在js中唯一一个自己不等于自己NaN)

对象的动态特性

1、在js中,一个对象需要属性,就可以利用object.Name = 值  的方式为其添加。只要赋值成功,对象就新增了属性。
  a) var car = {}; car.name : '法拉利';//动态添加属性
2、对象的访问形式   a) 点语法:‘ o.name ’   b) 关联数组:‘ o[‘name’]’ //方括号里面一定要是字符串,没有引号表示变量名,非引用属性   c) 小结:o[‘name’]== o.name
3、使用关联数组的地方   a) mix     function mix(o1,o2) { //在jq中将此函数命名为extend for (var k in o2) { o1[k] = o2 [k]; //关联数组 } }
4、凡是需要给对象动态添加成员的时候,必须使用关联数组的语法(因为。语法需要清楚的属性名)
5、O.sayHello()= o[‘sayHello’]();//();表示调用

 

作为函数参数

1、作为函数的参数,就是将参数的数据拷贝一份传递给函数定义中的参数
a)  function foo (num) {      
     }
         var a = 123;
         foo ( a );
函数在调用的时候,首先需要将参数中的数据拷贝一份,即数字123拷贝一份
跳转到函数定义中(函数体中),在此之前完成了参数的赋值,即num=123
正式的进入函数内,准备执行函数中的每一句话
2、值类型作为函数参数传递的特征,函数内与函数外是两个不同的变量,仅仅是值相等
3、引用类型作为函数参数传递的特征,函数内与函数外是两个不同的变量但是指向同一个对象   a) 因此在函数内部允许修改函数外部的变量值

构造函数的作用

构造函数是做什么用的

  1、初始化数据

  2、在js中,给对象添加属性用的,初始化属性值用

异常与捕获

可能出现的时候使用

异常:程序运行过程中出现的错误

js中出现异常后,浏览器会给出一段错误码,就是错误消息(类型加信息)

如何处理异常:出现异常后还能继续执行。

常见的异常两类:

1、运行环境的多样性(异常处理)

2、语法错误,代码错误

捕获:try-catch

尝试这么做,如果出现错误捕获错误

Try{

可能出现的错误

} catch e{ //e ->  error or exception表示错误对象

处理错误代码

1、代码正常运行,如果try中出现错误,try里面出现错误语句后面的代码不执行,直接跳到catch

2、catch中处理错误信息,

3、然后继续执行后面的代码

4、如果try中没有错误,那么不走catch直接执行后面的代码

如何抛出异常(未来三年内,自己写的函数必须符合特定要求)

js解析器运行预处理时会先解析,检查语法

1、throw是抛出异常的语法,其后跟一个对象,即错误对象

2、一般该对象使用new Error(‘错误信息’)来创建,也支持任意对象

补充:

1、try-catch语法的最终结构是try-catch-finally

Try{
 //可能出现的错误
} catch (e) { //e-》error or exception表示错误对象
 //处理错误代码
] finally {
 //try这个代码块之前执行,是始终执行的代码
}
任何一个DOM树结构的结论 1、所谓的DOM操作,操作的是什么? 2、一般DOM树结构 a) 父节点 兄弟节点 当前节点 属性节点 子节点
原文地址:https://www.cnblogs.com/Adam-Ye/p/11166179.html