deepClone

217 阅读1分钟

前言

这是我参与8月更文挑战的第1天,活动详情查看:8月更文挑战

含有对象内嵌对象的深克隆

个人学习,仅供参考。

代码实现

const person = {
    name: '程卓',
    age: 21,
    hobby: ['a', 'b'],
    score: [
        { 'Chinese': 90 },
        { 'Math': 95 }
    ],
    study: {
        basis: ['HTML', 'CSS', 'JavaScript'],
        frameWork: ['Vue', 'React']
    },
    phone: {
        one: { '康佳': 'E830' },
        tow: { '魅族': 'MX4 Pro' },
        three: { '魅族': 'Pro7 Plus' },
        four: { '魅族': '16s Pro' },
        five: { '魅族': '18' },
    }
}


function deepClone(origin, target) {
    var tar = target || {}    //如果有target就用,没有就用{}
    
    for (var k in origin) {
        if(origin.hasOwnProperty(k)) {  //遍历对象自身的属性值,不能有原型上的属性值
            if(typeof origin[k] === 'object' && origin[k] !== null){ //判断是否还为数组或对象,并且不能为空
                tar[k] = Object.prototype.toString.call(origin[k]) === '[Object Array]' ? [] : {}
                deepClone(origin[k], tar[k])
            } else {
                tar[k] = origin[k]
            }
        }
    }
    return tar
}

console.log(deepClone(person))