object
来源:8-23 手写JS深拷贝-考虑各种数据类型和循环引用
慕UI7606399
2022-03-22
老师,我试了一下不在声明 result 的时候赋默认值为空对象,在下方判断传入参数为对象是再赋值,就会死循环,这是为什么呢?
export function cloneDeep (obj: any, map = new WeakMap()):any {
if (typeof obj !== 'object' || obj == null) return obj
if (map.get(obj)) {
return map.get(obj)
}
let result: any // 暂不赋值,在下方判断是 obj 为对象后再赋值
map.set(obj, result)
if (obj instanceof Map) {
result = new Map()
obj.forEach((v, k) => {
const key = cloneDeep(k, map)
const value = cloneDeep(v, map)
result.set(key, value)
})
}
if (obj instanceof Set) {
result = new Set()
obj.forEach(v => {
const value = cloneDeep(v, map)
result.add(value)
})
}
if (obj instanceof Array) {
result = []
result = obj.map(item => cloneDeep(item, map))
}
if (Object.prototype.toString.call(obj) === '[object Object]') {
result = {} // 这里赋值
for (const key in obj) {
const val = obj[key]
const val1 = cloneDeep(val, map)
result[key] = val1
}
}
return result
}
其他的代码都没变
写回答
2回答
-
因为这里:
result 没有赋值,那你在 map 中设置的就是 undefined 。到时候判断循环引用,map 的数据就没有价值了
00 -
sanyeof
2022-04-08
weakmap设置target后,对map 等的循环引用的拷贝会出问题,深拷贝不到循环引用的map,可以在确定 target 类型后再设置 weakmap
00
相似问题
鲁棒性
回答 3
关于 ts 的变量类型
回答 1