实现一个深拷贝,这边使用 WeakMap
来解决循环引用的问题;
let weakMap = new WeakMap();
function deepClone(obj) {
if (obj === null) {
return obj
}
if (typeof obj !== 'object') {
return obj
}
if (obj.constructor === Date) return new Date(obj);
if (weakMap.has(obj)) { return weakMap.get(obj) };
let newObj = new obj.constructor(); // 拿到原型对象上的属性
weakMap.set(obj, newObj);
for (key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] = typeof obj[key] === 'object' ? deepClone(obj[key]) : obj[key] // 此处可以用 arguments.callee() 实现
}
}
return newObj
}