深拷贝+循环引用
不允许循环引用的深拷贝
function deepCopy(data) {
const weakMap = new WeakMap();
function copy(data) {
if (weakMap.has(data)) return null; //打断施法
const copyData = data instanceof Array ? [] : {};
weakMap.set(data, true);
for (let [key, value] of Object.entries(data)) {
copyData[key] = typeof value === "object" ? copy(value) : value;
};
return copyData;
}
return copy(data);
}
const a = {
b: [1],
c: 2
}
a.d = a;
console.log(deepCopy(a))
打断循环引用,以防内存泄漏,因为代码本身就有问题,所以null之后可以解决问题,使用时也能及时发现。
允许循环引用的深拷贝
function deepCopy(data) {
const weakMap = new WeakMap();
function copy(data) {
if (weakMap.has(data)) return weakMap.get(data); //打断施法
const copyData = data instanceof Array ? [] : {};
weakMap.set(data, copyData);
for (let [key, value] of Object.entries(data)) {
copyData[key] = typeof value === "object" ? copy(value) : value;
};
return copyData;
}
return copy(data);
}
const a = {
b: [1],
c: 2
}
a.d = a;
console.log(deepCopy(a))
允许拷贝,其实就是做了个记录,在weakMap 中如果存在已经拷贝过的值,直接把之前存的copyData 返回,如果没有,则记录一下。
这样的话,即便循环引用,引用的也是拷贝后的值,于是形成了两个内容相同但是完全独立的对象。
分类:
JavaScript
标签:
javascript深拷贝循环引用
版权申明
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿站点。未经许可,禁止转载。
暂无评论数据