支持循环引用的 js 对象深拷贝算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
function isObject(data) {
return Object.prototype.toString.call(data) === '[object Object]'
}

function clone(obj) {
const root = {}
const tmp = [
{
parent: root,
data: obj,
},
]
let i = 0
while (i < tmp.length) {
const source = tmp[i++]
const { data, parent } = source
for (let o in data) {
if (data.hasOwnProperty(o)) {
if (isObject(data[o])) {
const _cloned = tmp.find((source) => source.data === data[o])
if (_cloned) parent[o] = _cloned.parent
else tmp.push({ parent: (parent[o] = {}), data: data[o] })
} else parent[o] = data[o]
}
}
}
return root
}

const a = { b: { a: { c: 1 } }, d: 8 }
a.a = a
a.b.b = a.b
const b = clone(a)
b.b.b.a = 1
b.a.d = 9
console.log(b)
console.log(a)

 评论