木灵鱼儿

木灵鱼儿

阅读:121

最后更新:2021/09/01/ 10:19:28

深拷贝+循环引用

不允许循环引用的深拷贝

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 返回,如果没有,则记录一下。

这样的话,即便循环引用,引用的也是拷贝后的值,于是形成了两个内容相同但是完全独立的对象。

版权申明

本文系作者 @木灵鱼儿 原创发布在木灵鱼儿 - 有梦就能远航站点。未经许可,禁止转载。

关于作者

站点职位 博主
获得点赞 0
文章被阅读 121

相关文章