一。浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
二。赋值和浅拷贝的区别
- 当我们把一个对象赋值给一个新的变量时,赋的其实是该对象的在栈中的地址,而不是堆中的数据。也就是两个对象指向的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容,因此,两个对象是联动的。
- 浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。即默认拷贝构造函数只是对对象进行浅拷贝复制(逐个成员依次拷贝),即只复制对象空间而不复制资源。
三。浅拷贝的实现方式
1.Object.assign() (当object只有一层的时候,是深拷贝)
2.Array.prototype.concat()
3.Array.prototype.slice()
4.
function shallowCopy(src) {
var dst = {};
for (var prop in src) {
if (src.hasOwnProperty(prop)) {
dst[prop] = src[prop];
}
}
return dst;
}
四。深拷贝的实现方式
1.JSON.parse(JSON.stringify()) (可以实现数组或对象深拷贝,但不能处理函数)
2.函数库lodash
lodash.cloneDeep(obj1);
3.
function deepclone(sObj, cObj) {
cObj = cObj || (Array.isArray(sObj) ? [] : {});
for(let i in sObj) {
if(typeof sObj[i] === 'object') {
cObj[i] = Array.isArray(sObj[i]) ? [] : {};
deepclone(sObj[i], cObj[i])
} else {
cObj[i] = sObj[i]
}
};
return cObj;
}