11. 浅拷贝的实现

深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的。
浅拷贝和深拷贝的区别:
浅拷贝:创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址,如果其中一个对象改变了引用类型的属性,就会影响到另一个对象。
深拷贝:将一个对象从内存中完整的复制一份出来,从堆内存中开辟一个新区域存放。这样更改拷贝值就不影响旧的对象

  • 浅拷贝实现:
    查看答案
    function shallowCopy(target, origin){
    for(let item in origin) target[item] = origin[item];
    return target;
    }

    其他方法(内置api):

    1. Object.assign
      var obj={a:1,b:[1,2,3],c:function(){console.log('i am c')}}
      var tar={};
      Object.assign(tar,obj);

    当然这个方法只适合于对象类型,如果是数组可以使用slice和concat方法

    1. Array.prototype.slice
    var arr=[1,2,[3,4]];
    var newArr=arr.slice(0);
    1. Array.prototype.concat
    var arr=[1,2,[3,4]];
    var newArr=arr.concat();

    测试同上(assign用对象测试、slice concat用数组测试),结合浅拷贝深拷贝的概念来理解效果更佳