手动实现深拷贝
在JavaScript中,
简单类型会存储到栈中,简单类型的值会直接存在栈中
复杂类型(引用类型)会存储到堆中,复杂类型在栈中存储了一个地址,这个地址指向它的实际内容(在堆中)
浅拷贝
所以拷贝默认是复制栈中的内容(默认为浅拷贝),
对于简单类型来说,就是复制了它本身
对于复杂类型来说,只是复制了它内容的存储地址,
如果另一个复杂类型对这个复杂类型进行了浅拷贝,那么他们在栈中存储的指针指向同一个地址,如果其中一个复杂类型发生了变化,则另一个也会跟着变化
深拷贝
深拷贝是在堆中开辟一个新的位置,用来存放复制的复杂类型的值。那么两个复杂类型的栈中存储的地址就不一样了,改动其中一个不会再影响另一个
//默认参数为 obj={}
function deepClone(obj = {}) {
//如果obj是null 或者不是对象和数组,则直接返回
if (typeof obj !== 'object' || obj == null) {
return obj;
}
//初始化返回结果
let result;
//判断是数组还是对象
if (obj instanceof Array) {
result = [];
} else {
result = {};
}
for (let key in obj) {
//保证key不是原型对象里面带的属性
if (obj.hasOwnProperty(key)) {
//递归
result[key] = deepClone(obj[key]);
}
}
return result;
}
let obj1 = {
age: 20,
name: 'lizheng',
hobbies: {
playGame: "playGame",
study: "study",
sleep: "sleep"
}
}
let obj2 = deepClone(obj1);
obj2.name = 'lz';
console.log(obj1.name);//lizheng
console.log(obj2.name);//lz
let obj3 = deepClone();
console.log(obj3);// {} 空对象
- 本文链接:http://horry233.github.io/2020/09/15/%E6%89%8B%E5%86%99%E6%B7%B1%E6%8B%B7%E8%B4%9D/
- 版权声明:本博客所有文章除特别声明外,均默认采用 许可协议。
若没有本文 Issue,您可以使用 Comment 模版新建。
GitHub Issues