function deepClone(obj, hash = new WeakMap()) {if (obj === null) return obj; // 如果是 null 或者 undefined 我就不进行拷贝操作
if (obj instanceof Date) return new Date(obj);
if (obj instanceof RegExp) return new RegExp(obj);
// 可能是对象或者一般的值 如果是函数的话是不须要深拷贝
if (typeof obj !== "object") return obj;
// 循环援用属性的解决
if (hash.get(obj)) return hash.get(obj);
// 是对象的话就要进行深拷贝
let cloneObj = new obj.constructor();
// 找到的是所属类原型上的 constructor, 而原型上的 constructor 指向的是以后类自身
hash.set(obj, cloneObj);
for (let key in obj) {if (obj.hasOwnProperty(key)) {
// 实现一个递归拷贝
cloneObj[key] = deepClone(obj[key], hash);
}
}
return cloneObj;
}
如果没有 if (hash.get(obj)) return hash.get(obj); 这段代码会有限递归上来。
WeakMap 是为了不烦扰垃圾回收机制:hash.set(obj, cloneObj); 对 obj 产生的援用是弱援用。