手写一个深拷贝要考虑哪些?
- 循环引用
- new Array,new Object
- 正则、日期
- Symbol属性
js
const deepclone = (obj, hash=new WeakMap()) => {
if(obj instanceof Date) return new Date(obj);
if(obj instanceof RegExp) return new RegExp(obj);
if(obj==='null' || typeof obj !== 'object'){
return obj;
}
if(hash.has(obj)) return hash.get(obj);
let newObj = new obj.constructor();
hash.set(obj,newObj);
for(let key in obj){
if(obj.hasOwnProperty(key)){
newObj[key] = deepclone(obj[key], hash);
}
}
// 处理Symbol属性
let symbolKeys = Object.getOwnPropertySymbols(obj);
for(let i=0; i< symbolKeys.length;i++){
newObj[symbolKeys[i]] = deepclone(obj[symbolKeys[i]],hash);
}
return newObj;
}