借用 @浪里行舟 大佬几句话
-
浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址 ,所以如果其中一个对象改变了这个地址,就会影响到另一个对象。
-
深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象。
//代码实现深拷贝
function deepClone(obj, weakmap = new WeakMap()) {
//界限判断
if (obj instanceof RegExp) {
return new RegExp(obj)
}
if (obj instanceof Date) {
return new Date(obj)
}
if (typeof obj !== 'object') {
return obj
}
if (weakmap.has(obj)) {
return weakmap.get(obj)
}
//优先选择
let target = new obj.__proto__.constructor()
weakmap.set(obj, target)
// 优于 let target = Object.prototype.toString.call(obj)==='[object Array]'?[]:{}
for (let i in obj) {
if (obj.hasOwnProperty(i)) {
if (typeof obj[i] === 'object') {
target[i] = deepClone(obj[i], weakmap)
} else {
target[i] = obj[i]
}
}
}
return target
}