码上掘金实现深拷贝

82 阅读1分钟

我正在参加「码上掘金挑战赛」详情请看:码上掘金挑战赛来了!

介绍

本节,我们来学习下如何模拟深度拷贝的实现,深度拷贝在实际的开发和学习中还是比较常见和重要的,现在我将尝试实现深拷贝。

let obj = {
    name:"dzp"
}
let obj1 = {name:"dzp"}

let obj2 = obj

上面代码实例的obj1就是深拷贝,二者内部元素都是相同的,但是二者的本质地址是不同的内存单元。其中obj2是浅度拷贝,二者地址单元是同一块栈区。

码上掘金地址

实现逻辑介绍

function deepCopy(target,source) {
  for(let key in source) {
    let val = source[key]
    if(typeof val !== 'object') target[key] = val
    else {
      //1.获取构造函数
      let constructors = val.constructor
      //2.创建新对象
      let newObj = new constructors()
      //3.递归的拷贝

      deepCopy(newObj,val)
      target[key] = newObj
    }
  }
}
let obj1 = {
  a:{
    b:1
  },
  c:2
}
let obj2 = {}
deepCopy(obj2,obj1)
console.log(obj2)
obj1.a.b = 10
console.log(obj1,obj2)

  • 深拷贝的基本框架逻辑是递归完成的
  • 首先遍历需要拷贝的对象obj.
  • 如果遍历的属性是一个基础数据类型,直接赋值操作。
  • 如果遍历的属性是一个对象,首先那个这个属性的构造函数,然后创建对象的堆区空间
  • 将新创建的对象赋值
  • 继续递归上面的操作。

注意点

深拷贝有一个注意点是 循环引用的问题,上面的对象如果存在循环引用是有问题的,大家后续可以继续完熟上面的功能。

总结

以上是我对深拷贝的模拟设计,希望大家多多支持学习点赞。