改进版通过Json对象实现深复制的方法



function deepClone(obj, hash = new WeakMap()) {
    // 基本类型直接返回
    if (obj === null || typeof obj !== 'object') {
        return obj;
    }

    // 日期类型直接返回一个新的日期对象
    if (obj instanceof Date) {
        return new Date(obj);
    }

    // RegExp 对象直接返回一个新的 RegExp 对象
    if (obj instanceof RegExp) {
        return new RegExp(obj);
    }

    // 如果循环引用了就用 weakMap 来解决
    if (hash.has(obj)) {
        return hash.get(obj);
    }

    // Array 类型
    let cloneObj = Array.isArray(obj) ? [] : {};
    hash.set(obj, cloneObj);

    // 遍历对象自身的所有属性
    for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
            // 递归复制
            cloneObj[key] = deepClone(obj[key], hash);
        }
    }

    // 返回克隆的对象
    return cloneObj;
}

// 使用示例
const original = {
    date: new Date(),
    regex: /hello/g,
    numbers: [1, 2, 3],
    nested: {
        a: 1,
        b: { c: 2 }
    },
    // 引入循环引用
    self: null
};
original.self = original;

const cloned = deepClone(original);
console.log(cloned);
console.log(cloned.self === cloned); // true,说明循环引用被正确处理
console.log(cloned.self === original); // false,说明是深复制

这个改进版的深复制方法通过递归的方式实现了对JavaScript对象的深复制,同时使用了`WeakMap`来处理循环引用的问题,以及针对特殊对象(如`Date`和`RegExp`)进行了特殊处理。此外,该方法也处理了数组类型,使其能够正确地被深复制。