实现思路
使用Reflect.ownKeys遍历出对象的可枚举、不可枚举属性和Symbol属性,使用一个Map记载已经深拷贝的属性,如果已经存在,则直接赋值即可,不再进行拷贝。
代码
let map = new Map()
function deepClone(obj){
let newObj
if(typeof obj === 'object' && obj !== null){
if(map.get(obj)){
newObj = map.get(obj)
}else{
newObj = obj instanceof Array?[]:{}
map.set(obj,newObj)
Reflect.ownKeys(obj).forEach((key)=>{
newObj[key] = deepClone(obj[key])
})
}
}else{
newObj = obj
}
return newObj
}
let obj1 = {
a:1
}
let obj2 = {
b:obj1
}
obj1.c = obj2
//obj2里面发生了循环引用
let obj3 = deepClone(obj2)
console.log(obj1,obj2,obj3)