JavaScript中深层克隆函数
总体思路就是运用了一个递归,来持续验证当你克隆对象的时候,对象中未知元素具体有多少对象的问题。
function clone(origin, target) {
var target = target || {}; //判断是否传递了参数 target
var calls = Object.prototype.toString; //使用根源性的to string 方法 然后调用call改变to string 方法的指向 来判断是不是数组
var as_call = "[Object Array]"; // 方便做对比
for (var key in origin) { //设置一个for in循环来遍历 对象 for in循环也可以遍历数组
if (origin.hasOwnProperty(key)) { // 判断 对象中是否存在原型 如果有原型则不遍历原型中的属性
if (origin[key] !== "null" && typeof (origin[key]) ==
"object") { //判断遍历出的对象是不是原始值 如果是原始值就直接赋值 不是的话就继续 下面判断
/* if (calls.call(origin[key]) == as_call) { //判断是不是数组 如果是数组 就放一个空数组 然后复制
target[key] = [];
} else { //否则 不是数组他就是对象 就用一个空对象接受他
target[key] = {};
} */
target[key] = (calls.call(origin[key])) == as_call ? [] : {}; //简化上述过程
clone(origin[key], target[key]);
//使用递归 来持续验证 对象中的内容 又没有对象 如果有对象的话就持续调用 持续递归直到 遍历到原始值为止
} else {
target[key] = origin[key]; //递归的出口
}
}
}
return target; // 如果上述没有 target 的话 就返回一个 target
}