美文网首页
赋值、浅拷贝和深拷贝

赋值、浅拷贝和深拷贝

作者: Xu涵 | 来源:发表于2019-10-14 15:04 被阅读0次

    ECMAScript的数据类型

    基本数据类型

    • 基本数据类型主要是:undefined,boolean,number,string,null,symbol

    • 基本数据类型以名值存储在栈中

      let a = 1
      let b = a
      
      

      执行第一个语句之后,栈是这样的

      avatar

      执行第二个语句,就变成这样了

      avatar

      此时如果修改a的值,对b不会造成任何影响

    引用数据类型的存储

    • 包括:对象、数组、函数等

    • 引用类型存储在堆中

      let person1 = {}
      let person2 = {}
      
      
      avatar
      let a = [1,2,3]
      let b = a
      
      
      avatar

      引用类型的赋值就是将a的引用给b,两者指向同一块内存,两者的操作会互相影响

      a[1] = 5
      console.log(b[1])   //5
      console.log(a === b)  //true
      
      

    赋值和浅拷贝的区别

    • 赋值:简单地把变量的引用给目标变量

    • 浅拷贝:把对象的一级属性拷贝给另一个对象,但不包括子对象

    • 举个栗子:

      let a=[0,1,[2,3],4],
              b=a.slice(); //slice方法是实现浅拷贝的一种方式
      
      a[0]=1;
      a[2][0]=1;
      console.log(a,b);
      
      
      avatar

    深拷贝的方法

    • 深拷贝:把一个对象的所有子对象都拷贝给另一个对象,两个对象之间互不影响

    • 常用方法:

      • 可以用递归的方法

      • 用jQuery的extend方法

      • 用json对象

        function deepClone2(obj) {
          var _obj = JSON.stringify(obj),
            objClone = JSON.parse(_obj);
          return objClone;
        }
        
        
    参考资料

    https://juejin.im/post/59ac1c4ef265da248e75892b

    https://www.cnblogs.com/echolun/p/7889848.html

    相关文章

      网友评论

          本文标题:赋值、浅拷贝和深拷贝

          本文链接:https://www.haomeiwen.com/subject/hqyrmctx.html