<script type="text/javascript">
/*
第一次调用传入一个参数parent对象,函数有两个参数,多出来的参数为空即c为空,
递归调用遍历 numbers:[1,2,2],
letter:["a","b","c"],
obj:{
prop:1
},
每递归调用一次返回一次c c分别为numbers:[1,2,2], letter:["a","b","c"], obj:{prop:1},
第二次调用 p[i]不是对象 直接拷贝给c[i] c为{bool:true}
*/
function deepCopy(p,c){
//如果c不存在默认为{},存在则为c;
//第一次调用c为空{}
var c = c || {};
/*遍历p对象也就是parent对象 p[0,1,2,3]= parent = {
numbers:[1,2,2],
letter:["a","b","c"],
obj:{
prop:1
},
bool:true
};
*/
for(var i in p){
//如果p[i]是一个对象
if(typeof p[i] === "object"){
//如果p[i]对象的构造函数是Array c[i]=空数组 否则c[i]=空对象
c[i] = (p[i].constructor === Array) ? [] : {};
//递归调用 深度赋值 c[i]为空数组 p[i]数组对象拷贝给c[i]实现按值传递
deepCopy(p[i],c[i]);
}else{
//如果p[i]不是一个对象 那么直接拷贝
//
c[i] = p[i];
}
}
//返回c 第一次的调用并没有结束
return c;
}
var parent = {
numbers:[1,2,2],
letter:["a","b","c"],
obj:{
prop:1
},
bool:true
};
var mydeep = deepCopy(parent);//第一次调用 参数parent是一个对象
mydeep.numbers.push(4,5,6); //实际上是给c[numbers]添加元素
</script>
/*
第一次调用传入一个参数parent对象,函数有两个参数,多出来的参数为空即c为空,
递归调用遍历 numbers:[1,2,2],
letter:["a","b","c"],
obj:{
prop:1
},
每递归调用一次返回一次c c分别为numbers:[1,2,2], letter:["a","b","c"], obj:{prop:1},
第二次调用 p[i]不是对象 直接拷贝给c[i] c为{bool:true}
*/
function deepCopy(p,c){
//如果c不存在默认为{},存在则为c;
//第一次调用c为空{}
var c = c || {};
/*遍历p对象也就是parent对象 p[0,1,2,3]= parent = {
numbers:[1,2,2],
letter:["a","b","c"],
obj:{
prop:1
},
bool:true
};
*/
for(var i in p){
//如果p[i]是一个对象
if(typeof p[i] === "object"){
//如果p[i]对象的构造函数是Array c[i]=空数组 否则c[i]=空对象
c[i] = (p[i].constructor === Array) ? [] : {};
//递归调用 深度赋值 c[i]为空数组 p[i]数组对象拷贝给c[i]实现按值传递
deepCopy(p[i],c[i]);
}else{
//如果p[i]不是一个对象 那么直接拷贝
//
c[i] = p[i];
}
}
//返回c 第一次的调用并没有结束
return c;
}
var parent = {
numbers:[1,2,2],
letter:["a","b","c"],
obj:{
prop:1
},
bool:true
};
var mydeep = deepCopy(parent);//第一次调用 参数parent是一个对象
mydeep.numbers.push(4,5,6); //实际上是给c[numbers]添加元素
</script>