综合应用-深度克隆[JavaScript_012]

2019-03-18  本文已影响0人  六亲不认的步伐

问题背景

JavaScript值类型主要是分为引用值(对象,数组等),非引用值(boolean,string,number等).
克隆效果要求:原对象的所有属性值进行克隆;原对象修改任意类型属性数据时,克隆的对象不做修改

分析难点

非引用值类型:直接对应属性赋值即可
引用值类型:存在修改原对象的属性导致克隆的对象属性值也被修改(问题关键)

代码实现

function deepClone(origin, target) {
    var target = target || {}, //对转换目标进行初始化,若传入的target不空延续使用,否则进行重新声明
        toStr = Object.prototype.toString, //简化后面操作,使用的是Object.prototype.toString.call()进行类型获取,用于判断数组还是对象
        arrStr = "[object Array]"; //声明比较的对象
    for (var prop in origin) { //遍历获取属性
        if (origin.hasOwnProperty(prop)) { //判断是否为自身属性
            if (origin[prop] !== "null" && typeof(origin[prop]) == 'object') { //非空引用判断
                target[prop] = toStr.call(origin[prop]) == arrStr ? [] : {}; //判断是数组还是对象
                deepClone(origin[prop], target[prop]); //递归调用
            } else {
                target[prop] = origin[prop]; //非引用值进行克隆
            }
        }
    }
    return target; //返回克隆对象
}
上一篇 下一篇

猜你喜欢

热点阅读