如果要复制下面这样一个对象:
var xm={
age:20,
name:'li',
fa:[1,2],
gf:{
sex:'femal',
family:[9,8]
}
}
只用for in循环是远远不够的,因为内部的fa数组和gf对象就只是取得了引用地址,复制后的对象和xm对象引用的是同样的一个fa和gf
如果想实现深度复制怎么办?主要可以考虑下面两种情况:数组、对象。
数组和对象的复制可以通过for in循环里嵌套一个循环来解决。但是这么嵌套下去也不是个办法啊,这时候函数递归就起到了作用,比如下面:
function copyObj(obj) {
var newobj={};
for(var j in obj){
if (obj[j] instanceof Array) {
newobj[j]=copyArray(obj[j]);
}else if(obj[j] instanceof Object){
newobj[j]=arguments.callee.call(null,obj[j]);
}else{
newobj[j]=obj[j];
}
}
function copyArray(arr) {
var newarr=[];
for(var i in arr){
newarr[i]=arr[i];
}
return newarr;
}
return newobj;
}
调用:
var xm={
age:20,
name:'li',
fa:[1,2],
gf:{
sex:'femal',
family:[9,8]
}
}
var xh=copyObj(xm);
console.log(xh);
console.log(xm);
检验:
console.log(xh);
console.log(xm);
xh.gf.family[0]='mail';
打印结果显示,深度复制成功,看标红的地方,是不是不一样,说明引用的是两个不同的对象。
qwr.html:40 {age: 20, name: "li", fa: Array(2), gf: {…}}age: 20fa: (2) [1, 2]gf: family: (2) [ 9, 8]sex: "femal"__proto__: Objectname: "li"__proto__: Object