浅拷贝与深拷贝区别
-
浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址 ,所以如果其中一个对象改变了这个地址,就会影响到另一个对象。
-
深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象。
总而言之,浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
实现浅拷贝
1. 利用Object.assign 实现。该方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。(针对对象只有一层,没有嵌套的情况)
var obj = {name: 'zxx'};
var copy = Object.assign({}, obj)
2. 利用ES6展开运算符...实现浅拷贝
var obj = {name: 'zxx', info: {age: 1}};
var copy = {...obj};
obj.info.age = 18;
console.log(copy.info.age); // 18
3. 数组只有一层的话可以利用concat, slice 等实现;
var arr = [1,2, 3];
var arr1 = arr.concat();
var arr2 = arr.slice();
4.手动实现
function copy(obj){
if(typeof obj === 'object' && target !== null){
let cloneTarget = Object.prototype.toString.call(obj) === '[object Object]': {} : [];
for(var key in obj){
//遍历obj,并且判断是obj的属性才拷贝
if(obj.hasOwnProperty(key)){
cloneTarget[key] = obj[key];
}
}
return cloneTarget;
}else {
return obj;
}
}
下一篇实现深拷贝