这里两个重点
1.同过hashMap记录该对象是否已经被拷贝,从而避免对象循环赋值报错
2.通过origin.constructor即可拿到原型构造方法,不需要去toString判断对象是数组还是对象类型
function deepClone(origin,hashMap = new WeakMap()){
if(origin == undefined || typeof origin !=='object'){
return origin;
}
if(origin instanceof Date){
return new Date(origin);
}
if(origin instanceof RegExp){
return new RegExp(origin);
}
const hashKey = hashMap.get(origin);
if(hashKey){
return hashKey
}
const target =new origin.constructor();
hashMap.set(origin,target)
for(let k in origin){
if(origin.hasOwnProperty(k)){
target[k] = deepClone(origin[k],hashMap)
}
}
}
let test1 = {};
let test2 = {};
test2.test1 = test1;
test1.test2 = test2;
console.log(deepClone(test2));