zoukankan      html  css  js  c++  java
  • 引用类型起的锅

    JavaScript有基本类型和引用类型

    基本类型Number、String、Boolear、Null、undefined

      数据存放在栈

        var a=10;
        var b=a;
         b=20;
         console.log(b) //20

    引用类型Objec、Function

      数据存放在堆中

    1 var obj1=new object();
    2 var obj2=obj1;
    3 obj2.name="好了你有名字了";
    4 console.log(obj1.name);  //好了你有名字了
    //浅拷贝的例子

     

    因为引用类型所以要知道深浅拷贝的问题,不然出现一些分歧。

    浅拷贝:仅是复制地址,彼此间操作相互影响                        深拷贝:复制内容,有不同的存放地址,不相互影响

    总结为:

      指向:浅拷贝(只知道地址)
      真正的复制:深拷贝(存放内容)

    还会有伪深拷贝:只实现一维的深拷贝·,如assign
    对象的深拷贝(实现对象的深度克隆):递归、继承、stringify的转换还原
     
    较为经典的题目
    题目1
     1  var a = {n: 1};
     2  var b = a;
     3     a.x = 2;
     4     console.log(b.x);
     5         
     6         
     7    a = {n: 3};
     8         console.log(b.x);
     9    a.x = 4;
    10         console.log(b.x);

    结果都为2

     1 分析:a对象存放 n:1
     2     b指向a引用,即b指向a对象存放”地址“。
     3     a.x=2,存放添加 x:2 4     所以b.x 、a.x都是同样    这是指向的分辨,(你家地址没变,变的只是人)

    5 改变了a,改为n:3,此时a存放的地址内容会变 这是真正复制的考察 6 此时 7 a={n:3} 8 b={n:1,x:2} 9 给a添加属性x,a.x=410 此时 11 a={n:3,x:4} 12 b={n:1,x:2}

     经典题目2

    1 var a={n:1};
    2 var b=a;
    3       a.x=a={n:2};
    4 
    5       console.log(a.x);    //undefined
    6       console.log(b.x);   //2

     显然这题的重点是a.x=a={n:2};

     1 分析:  a.x=a={n:2};
     2       . 的优先级高,即先是给a添加属性x
     3 此时
     4   a、b是一样,{n:1,x:undefined}  //看图1
     5     = 赋值 拆分为:a.x=a    a={n:2} 
     6 分为2步:a.x=a 
     7 此时
     8    b={n:1,x:a}
     9    a={n:1,x:a}
    10     a={n:2},a改变了,改为n:2,此时a存放的地址内容会变
    11 b={n:1,x:a} 12 a={n:2} 13

    图1

    结果

  • 相关阅读:
    梅花雨控件使用时注意的...
    利用XML实现通用WEB报表打印(实现篇)
    Improve performance using ADO.NET 2.0 batch update feature
    hook
    owc11生成饼状图
    PHP数组合并:[“+”运算符]、[array_merge]、[array_merge_recursive]区别
    PHP中使用函数array_merge()合并数组
    WCF 第四章 绑定
    WCF 第四章 绑定 跨机器通信
    WCF 第六章 序列化与编码 系列文章
  • 原文地址:https://www.cnblogs.com/TAO-JL/p/10548601.html
Copyright © 2011-2022 走看看