• 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) 父节点 兄弟节点 当前节点 属性节点 子节点
  • 相关阅读:
    NXOpen 各种参数(字符)类型转换
    NXOpen 重命名装配组件
    NXOpen 选择过滤
    【ASP.NET Core】一个默认的网站
    将博客搬至CSDN
    VS2017 .net core web项目 添加引用 报错 vs2017添加引用时报错未能正确加载“ReferenceManagerPackage”包
    负载均衡时,在State_Server模式中的Session共享问题(不讨论负载均衡的问题)
    修改linux文件权限命令:chmod
    Linux命令学习
    开闭原则
  • 原文地址:https://www.cnblogs.com/Adam-Ye/p/11166179.html
Copyright © 2020-2023  润新知