基于实现深拷贝的方式:

229 阅读1分钟
  1. JSON.parse(JSON.Stringfy(target))
  2. es5的循环递归
function deepClone(origin, target) {
    target = target || {};
    let array = '[object Array]',
        toStr = Object.prototype.toString;
    for (let k in origin) {
        if (origin.hasOwnProperty(k)) {
            if (typeof target === 'object' && target !== null) {
                target[k] = (toStr.call(origin[k]) === array) ? [] : {}
                deepClone(target[k], origin[k])
            } else {
                target[k] = origin[k]
            }
        }
    }
    return target
}
  1. es6的循环递归
const origin = {
    name: '胖达',
    age: 13,
    born: new Date(),
    hobby: {
        eat: ['冰淇淋', '汉堡', '阔洛', '薯条'],
        sleep: '深度睡眠',
        sports: {
            ball: {
                ball1: '篮球',
                ball2: '羽毛球'
            },
            jump: ['调高', '跳绳']
        }
    }

}

function deepClone(origin, hashMap = new WeakMap()) {
    if (origin === undefined || typeof origin !== 'object') {
        return origin
    }

    if (origin instanceof Date) {
        return new Date(origin)
    }
    if (origin instanceof RegExp) {
        return new RegExp(origin)
    }
    let hashKey = hashMap.get(origin);
    console.log('hask', hashKey)
    if (hashKey) {
        return hashKey
    }
    let target = new origin.constructor();
    hashMap.set(origin, target)
    for (let k in origin) {
        if (origin.hasOwnProperty(k)) {
            target[k] = deepClone(origin[k], hashMap)
        }
    }
    return target
}
// 场景一:
let target = deepClone(origin)
origin.hobby.eat.push('螺狮粉')
target.hobby.sports.ball.ball3 = '乒乓球'
console.log('target-', target)
console.log('origin-', origin)

// 场景二:
let t1 = {},
    t2 = {};
t1.t2 = t2;
t2.t1 = t1;
let t3 = deepClone(t1)
console.log(999, t3)