// 分别用深度优先和广度优先实现一个深拷贝
const source = {
a: {
name: 'tom',
age: 20,
skills: [1, 2, 3, { like: 2 }]
},
b: {
name: 'jerry',
age: 21,
skills: [4, 5, 6, { love: 3 }]
}
}
// 深度优先拷贝 不考虑环的情况
const deepCloneDFS = (source) => {
let target = Array.isArray(source) ? [] : {}
let stack = []
stack.push([target, source])
while (stack.length) {
const [tar, sou] = stack.pop()
for (let i in sou) {
if (typeof sou[i] === 'object') {
tar[i] = Array.isArray(sou[i]) ? [] : {}
stack.push([tar[i], sou[i]])
} else {
tar[i] = sou[i]
}
}
}
return target
}
// 广度优先拷贝 不考虑环的情况
const deepCloneBFS = (source) => {
let target = Array.isArray(source) ? [] : {}
let queue = []
queue.push([target, source])
while (queue.length) {
const [tar, sou] = queue.shift()
for (let i in sou) {
if (typeof sou[i] === 'object') {
tar[i] = Array.isArray(sou[i]) ? [] : {}
queue.push([tar[i], sou[i]])
} else {
tar[i] = sou[i]
}
}
}
return target
}
const target = deepCloneBFS(source)
target.a.name = 'Hello'
console.log(target)
console.log(source)
console