js实现引用对象的深度复制

来源:互联网 发布:百利进销存软件网络版 编辑:程序博客网 时间:2024/05/18 13:06

如果要复制下面这样一个对象:

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';

打印结果显示,深度复制成功,看标红的地方,是不是不一样,说明引用的是两个不同的对象。


{age: 20, name: "li", fa: Array(2), gf: {…}}age: 20fa: (2) [1, 2]gf: family: (2) ["mail", 8]sex: "femal"__proto__: Objectname: "li"__proto__: Object
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
原创粉丝点击