JS实现深拷贝

注意解决循环引用问题

function deepClone(obj) {
    // 记录处理过的对象,解决循环引用问题
    let map = new WeakMap()

    function clone(obj) {
        // 其他类型,如字符串、数字的直接返回
        if(typeof obj !== 'object') {
            return obj
        }

        // 循环引用了,之前已经处理过,直接返回
        if(map.has(obj)) {
            return map.get(obj)
        }

        // 判断是数组还是对象
        let newObj = Array.isArray(obj) ? [] : {}
        // 记录处理过的对象
        map.set(obj, newObj) // 注意不能写在for循环后面
        for(let key in obj) {
            newObj[key] = clone(obj[key])
        }

        return newObj
    }

    return clone(obj)
}

let obj = { name: '1', address: {x: 100, y: 100}}
obj.o = obj
console.log(deepClone(obj))