综合应用-深度克隆[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; //返回克隆对象
}