11. 浅拷贝的实现
深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的。
浅拷贝和深拷贝的区别:
浅拷贝:创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址,如果其中一个对象改变了引用类型的属性,就会影响到另一个对象。
深拷贝:将一个对象从内存中完整的复制一份出来,从堆内存中开辟一个新区域存放。这样更改拷贝值就不影响旧的对象
- 浅拷贝实现:
查看答案
function shallowCopy(target, origin){ for(let item in origin) target[item] = origin[item]; return target; }
|
其他方法(内置api):
- 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方法
- Array.prototype.slice
var arr=[1,2,[3,4]]; var newArr=arr.slice(0);
|
- Array.prototype.concat
var arr=[1,2,[3,4]]; var newArr=arr.concat();
|
测试同上(assign用对象测试、slice concat用数组测试),结合浅拷贝深拷贝的概念来理解效果更佳