手写深拷贝(WeakMap与垃圾回收)

1,378 阅读1分钟

乞丐版

var cloneObject = {
    // ...省略代码
}
var cloneTarget = JSON.parse(JSON.stringify(cloneObject));

:可以应对大部分的应用场景(数组、对象),但是它还是有很大缺陷的,比如拷贝其他引用类型、拷贝函数、循环引用等情况

基础版本

function clone(cloneObject, map = new Map()) { // 用Map在垃圾回收机制中为强引用;即使cloneObject = null,Map中还是有对cloneObject原堆地址引用
    if (typeof target === 'object') {
        let cloneTarget = Array.isArray(target) ? [] : {};
        if (map.get(target)) {
            return map.get(cloneObject);
        }
        map.set(target, cloneTarget);
        for (const key in cloneObject) {
            cloneTarget[key] = clone(cloneObject[key], map);
        }
        return cloneTarget;
    } else {
        return target;
    }
};

关于

注:可以使用WeakMap,原对象引用垃圾回收后map相应属性也被delete

function clone(cloneObject, map = new Map()) {
    // ...省略代码
}

你不知道的 WeakMap-涉及内存收-阿宝哥
理解 WeakMap 的 weak
WeakMap and WeakSet(弱映射和弱集合)
阮一峰-WeakMap

终极版

注:看lodash源码