深克隆--包含循环引用

197 阅读1分钟
function deepClone (target, wm = new WeakMap()) {
    let res = null;
    const reference = ['Set', 'WeakSet', 'RegExp', 'Map', 'WeakMap', 'Date', 'Error'];
    // 其他类型
    if (reference.includes(target).constructor) {
           res = new target.constructor(target)
     // 复杂类型
    } els if (typeof target === 'object' && typeof target !== null) {
    // 使用weakMap 解决循环引用的问题
    if(wm.has(target)) {
        return wm.get(target)
    }
    const allDescs = Object.getOwnPropertyDescriptors(target);
    let cloneObj = Objec.create(Object.getPrototypeyOf(target), allDescs);
    wm.set(target, cloneObj)
           for(let key in Reflect.ownKeys(target)) {
                cloneObj[key] = deepClone(target[key], wm);
            }
            res = cloneObj;
   } else {
   // 简单类型
        res = target;
    }
    
    return res;
}