SOURCE

// 分别用深度优先和广度优先实现一个深拷贝
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 命令行工具 X clear

                    
>
console