我正在参加「码上掘金挑战赛」详情请看:码上掘金挑战赛来了!
介绍
本节,我们来学习下如何模拟深度拷贝的实现,深度拷贝在实际的开发和学习中还是比较常见和重要的,现在我将尝试实现深拷贝。
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.
- 如果遍历的属性是一个基础数据类型,直接赋值操作。
- 如果遍历的属性是一个对象,首先那个这个属性的构造函数,然后创建对象的堆区空间
- 将新创建的对象赋值
- 继续递归上面的操作。
注意点
深拷贝有一个注意点是 循环引用的问题,上面的对象如果存在循环引用是有问题的,大家后续可以继续完熟上面的功能。
总结
以上是我对深拷贝的模拟设计,希望大家多多支持学习点赞。