javaScript深度克隆
在做项目的时候,需要用到克隆操作。但是查找发现javaScript并没有提供克隆的方法,这对于常年开发java的我来说,是很不方便的事情。查找资料的时候,发现JQuery自带exten
方法是可以进行对象复制,但是克隆出的对象引用地址还是原对象地址,这样达不到我的需求。1.脱离原对象引用地址,开辟新地址,2.深度克隆对象,向下克隆对象属性。于是参考网上自行码了一个深度克隆方法。代码如下:
//判断类型
function isClassType(Obj){
var clType=Object.prototype.toString.call(Obj);//[object Object]
return clType.substring(clType.indexOf(" ")+1,clType.length-1);
}
//深度克隆
function objClone(obj){
var result;
if(isClassType(obj)=='Object')//对象类型
result={};
else if(isClassType(obj)=='Array')//Array集合类型
result=[];
else
return obj;
//遍历并递归,深度克隆的关键
for(x in obj){
result[x]=objClone(obj[x]);
}
return result;
}
var nl=null, //null
undefin, //undefined
num=1, //number
str="", //string
fun=function(){},//funcation
map={a:1,b:2,c:3},//map
map2={a:'a'},
array=[map2,2,3]; //array
map.fun=fun;
map.num=num;
map.undefin=undefin;
map.nl=nl;
map.array=array;
var map1=objClone(map);
map1.a="test";
console.log(map);
console.log(map1);
控制台查看克隆对象,如下:
我更改了map1的a属性,原对象map的a属性并没有改变,满足了我的脱离原对象引用地址的需求。map1属性下面的array属性也进行原封不动的克隆过来,满足了我的深度克隆需求。目前只是进行了简单的克隆测试,如果大家发现新的bug欢迎留言。