浅谈Javascript中深复制
在javascript中,所有的object变量之间的赋值都是传地址的,可能有同学会问哪些是object对象。举例子来说明可能会比较好:
typeof(true) //"boolean" typeof(1) //"number" typeof("1") //"string" typeof({}) //"object" typeof([]) //"object" typeof(null) //"object" typeof(function(){}) //"function"
所以其实我们深复制主要需要处理的对象就是object对象,非object对象只要直接正常的赋值就好。我实现js深复制的思路就是:
遍历所有该对象的属性,
如果该属性是"object"则需要特殊处理,
如果这个object对象比较特殊,是一个数组,那就创建一个新的数组并深复制数组里的元素
如果这个object对象是个非数组对象,那直接再对它递归调用深复制方法即可。
如果不是"object",则直接正常复制就行。
下面就是我的实现了:
Object.prototype.DeepCopy=function(){ varobj,i; obj={};
for(attrinthis){ if(this.hasOwnProperty(attr)){ if(typeof(this[attr])==="object"){ if(this[attr]===null){ obj[attr]=null; } elseif(Object.prototype.toString.call(this[attr])==='[objectArray]'){ obj[attr]=[]; for(i=0;i<this[attr].length;i++){ obj[attr].push(this[attr][i].DeepCopy()); } }else{ obj[attr]=this[attr].DeepCopy(); } }else{ obj[attr]=this[attr]; } } } returnobj; };