深拷贝,解决嵌套循环问题。

function deepClone(target) {
    const map = new WeakMap()

    function _deepClone(value) {
        if (typeof value !== 'object' || value === null) return value
        if (value instanceof Date) return new Date(value.getTime())
        if (value instanceof RegExp) return new RegExp(value)
        if (map.has(value)) return map.get(value)
        const result = Array.isArray(value) ? [] : {}
        map.set(value, result)
        for (const key in value) {
            if (value.hasOwnProperty(key)) {
                result[key] = _deepClone(value[key])
            }
        }
        return result
    }

    return _deepClone(target)
}

const obj = {
    a: 1,
    b: [2, 3, 4],
    c: {d: 5},
}
obj.e = obj
const newObj = deepClone(obj)
console.log(obj, newObj)            // 输出直观上两个obj内容相等
console.log(obj !== newObj)         // true
console.log(obj.e !== newObj.e)     // true
console.log(newObj.e === newObj)    // true

更多推荐