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`)进行了特殊处理。此外,该方法也处理了数组类型,使其能够正确地被深复制。