JavaScript 对象深拷贝,嵌套对象处理
可以使用 ES6 的 WeakMap
将对象保存起来,循环中遇到相同对象直接指向已经存在的对象即可
WeakMap 对象是一组键值对的集合,其中的键是弱引用的,其键必须是对象,而值可以是任意值
function clone(obj) {
let map = new WeakMap() // 创建 WeakMap 用于保存已经被创建的对象
function deep(data) {
let result = {}
const keys = [...Object.getOwnPropertyNames(data), ...Object.getOwnPropertySymbols(data)]
if(!keys.length){
return data
}
const exist = map.get(data)
if(exist){ // 判断对象是否已经创建,存在直接返回
return exist
}
map.set(data, result)
keys.forEach(k => {
let item = data[k]
if(typeof item === 'object' && item){
result[k] = deep(item)
} else {
result[k] = item
}
})
return result
}
return deep(obj)
}
let a = {
name: 'a',
}
let b = {
name: 'b',
}
a.b = b
b.a = a
let e = clone(a)