有时,我们需要对一个对象进行复制,如下列要求:
1. 使用递归来实现一个深度克隆,可以复制一个目标对象,返回一个完整拷贝
2. 被复制的对象类型会被限制为数字、字符串、布尔、日期、数组、Object对象。
<script>
function isObject(obj){
if(Object.prototype.toString.call(obj)===‘[object Array]‘ || Object.prototype.toString.call(obj)===‘[object Object]‘)
return true;
else
return false;
}
function cloneObject(obj){
var cloneObj;
cloneObj=(obj instanceof Array) ? []:{}; //判断对象类型,新建克隆对象
for(var i in obj){
if(obj.hasOwnProperty(i)){
cloneObj[i]=isObject(obj[i]) ? cloneObject(obj[i]):obj[i];
}
}
return cloneObj;
}
</script>
在题目中,object对象包含两种,一个是数组Array,另一个是{}
obj instanceof Array 通过判断来新建克隆对象属于哪一种
对于简单数组,我们会遇到这种情况
var ary=[1,2,3,4];
var ary1=ary;
ary[0]=8;
console.log(ary[0]);//结果为8
console.log(ary1[1]);//结果为8
为什么会出现这种情况呢?
数组是引用类型数据,在数组之间进行赋值时,没有为新的数组另外开辟内存空间,而是将新数组变量的引用地址指向了原来的数组,所以当原来数组发生变化时,新数组也会产生同样变化。
这不是我们想要的结果,那我们就需要考虑数组克隆了。
下面我们就为数组Array原型添加一个数组克隆的方法
实现数组克隆的方式很多,简单列举几种:
1. 我们最容易想到的一种方式
Array.prototype.clone=function(){
var a=[];
for(var i=0,l=this.length;i<l;i++)
a.push(this[i]);
return a;
}
2. 通过Array对象的slice方法
slice方法是通过参数start和end的传入值来返回数组中的一段,该方法不对原数组进行操作。我们通过slice(0)可以使其返回所有项。
Array.prototype.clone=function(){
return this.slice(0);
}
3. 通过Array对象的concat方法
concat方法是用来实现数组的合并的。通过和一个空函数的合并,即可实现我们的克隆功能。
Array.prototype.clone=function(){
return [].concat(this);
}
//或者
Array.prototype.clone=function(){
return this.concat();
}
原文地址:http://blog.csdn.net/u012193330/article/details/45643869