深拷贝的循环引用问题

作者:xie392地址:https://v.douyin.com/iexSuQJj/更新时间:2024-12-21

案例代码

1
const obj = {
2
arr: [1,2,3],
3
a: 4
4
}
5
6
obj.sub = obj
7
obj.arr.push(obj)
8
9
function deepClone(value) {
10
// WeakMap 可以用来存储对象,因为它可以被垃圾回收
11
const cache = new WeakMap()
12
13
function _deepClone(value) {
14
if(value === null || typeof value !== 'object') {
15
return value
16
}
17
18
if(cache.has(value)) {
19
return cache.get(value)
20
}
21
22
const cloneObj = Array.isArray(value) ? [] : {}
23
cache.set(value, cloneObj)
24
for(let key in value) {
25
if(value.hasOwnProperty(key)) {
26
cloneObj[key] = _deepClone(value[key])
27
}
28
}
29
return cloneObj
30
}
31
32
return _deepClone(value)
33
}
34
35
36
const newArr = deepClone(obj)
37
console.log(newArr.arr !== obj.arr) // true
38
console.log(newArr.sub !== obj.sub) // true
39
console.log(newArr.arr[3] !== obj) // true

输出结果:

1
true
2
true
3
true