深拷贝和浅拷贝

205 阅读1分钟
  • 对象如果只有一层(属性值都是基本数据类型)只用浅拷贝

    • Object.assign({},原始对象)
    • {...obj}
  • 对象如果有多层,只能用深拷贝

    • 如果对象值不是函数,undefined这些,直接JSON.parse(JSON.stringify(原始对象))

      • 如果值是函数,undefined会丢失掉
    • 递归的写法

      • 循环引用的问题

        • juejin.cn/post/691651…

        • 代码运行后直接报错: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)