// 深度克隆
// 将obj的属性克隆到obj1上面。
// 在obj1上面添加属性不影响obj上面的属性
var obj = {
name: "abc",
age: 9,
sex: "female",
card: ['visa', 'master'],
wife: {
name: "bcd",
son: {
name: "bcd",
son: "xx"
}
}
}
var obj1 = {}
function deepClone(origin, target) { // 传入参数
var target = target || {}, // 防止没有写接收克隆的目标,所以兼容一下,如果没有就用空对象去接收
toStr = Object.prototype.toString, // 把原型上的toString付给toStr
arrStr = "[object Array]"; //toString为数组的判断结果
for (var prop in origin) { //循环起源对象
if (origin.hasOwnProperty(prop)) { //不拿原型上的东西,如果有原型上的属性就不进入判断
if (origin[prop] !== "null" && typeof (origin[prop]) == 'object') { //不拿起源对象上面为空的值,拿原始值
if (toStr.call(origin[prop]) == arrStr) { //为数组否则为对象
target[prop] = []; //创建空数组接收
} else { //为对象
target[prop] = {}; //创建空对象接收
}
deepClone(origin[prop], target[prop]); //执行递归,进入第二层重复判断这整个流程
} else {
target[prop] = origin[prop]; //如果是应用值直接付给目标
}
}
}
return target; //防止没写接收的目标,返回克隆完成后的目标
}
deepClone(obj, obj1);