-
对象如果只有一层(属性值都是基本数据类型)只用浅拷贝
- Object.assign({},原始对象)
- {...obj}
-
对象如果有多层,只能用深拷贝
-
如果对象值不是函数,undefined这些,直接JSON.parse(JSON.stringify(原始对象))
- 如果值是函数,undefined会丢失掉
-
递归的写法
-
循环引用的问题
-
代码运行后直接报错:Maximum call stack size exceeded,调用栈溢出,因为我们的需要拷贝的源对象存在循环引用,所以deepClone 函数会不断入栈,最后栈溢出。
-
解决办法:解决这一循环引用的问题其实很简单,我们只需要在每次对复杂数据类型进行深拷贝前先在weakMap中保存其值,如果下次又出现了该值,就不再进行拷贝,直接截止。
- 理解不难:拷贝第一次赶紧用weakMap存起来,下一次遇到直接在weakMap拿
-
-
// seven有一个属性叫relative指向juejin,juejin也有一个属性叫relative指向seven 这个叫循环引用
// 循环引用在递归的时候不处理就会栈溢出
const seven = {
name: 'seven'
}
const juejin = {
name: 'juejin',
relative: seven
}
seven.relative = juejin
const newObj = deepClone(seven)
console.log(newObj)