不允许循环引用的深拷贝

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深拷贝循环引用

评论

暂无评论数据

暂无评论数据

目录