记录:深拷贝实现

67 阅读1分钟

记录使用WeakMap对象实现深拷贝

记录使用WeakMap对象实现深拷贝

记录使用WeakMap对象实现深拷贝

知识点

ES6 WeakMap对象

function isObject(target) {
    return (typeof target === "object" || typeof target === "function") && target !== null
}

function deepClone(target, map = new WeakMap()) {
    if (map.get(target)) {
        return target
    }
    // 获取当前值的构造函数:获取它的类型
    let constructor = target.constructor
    // 检测当前对象target是否与正则、日期格式对象匹配
    if (/^(RegExp|Date)$/i.test(constructor.name)) {
        // 创建一个新的特殊对象(正则类/日期类)的实例
        return new constructor(target)
    }
    if (isObject(target)) {
        map.set(target, true);  // 为循环引用的对象做标记
        const cloneTarget = Array.isArray(target) ? [] : {}
        for (let prop in target) {
            if (target.hasOwnProperty(prop)) {
                cloneTarget[prop] = deepClone(target[prop], map)
            }
        }
        return cloneTarget
    } else {
        return target
    }
}