复制数组:
javascript中操作对象与java一样采用引用的方式,所以如果通过obj2 = obj1的方式进行数组复制的时候,无论对obj2还是obj1所做的修改都同时影响两个变量的值,从而引发不愿意看到的后果。下面介绍两种实现简单数组元素复制的方法。
(1) 借用slice()进行数组的复制
slice() 函数可从已有的数组中返回选定的元素。使用语法为:
arrObject.slice(start,end); //start,开始位置;end,结束位置
slice()函数将会返回一个新的数组对象,所以使用slice(0)就可以实现数组的复制.
测试代码:
var arr = [1,2,3,4];
var clone = arr.slice(0);
arr.splice(1,2);//删除从位置1开始的两个元素
alert("arr:" + arr + "\nclone:" + clone);//arr:[1,4] clone:[1,2,3,4]
(2) 借用concat()函数进行数组的复制
concat() 用于进行数组的合并。使用语法为:
arrayObject.concat(arrayX,arrayX,......,arrayX)
concat()用于多个数组的合并,但是返回的结果是一个新的数组,而不再引用用于合并的任何一个数组。可以利用它的这个特性来用一个数组连接空数组或直接不传参数完成clone的功能.
测试代码:
var arr = [1,2,3,4];
var clone = arr.concat();
arr.splice(1,2);//删除从位置1开始的两个元素
alert("arr:" + arr + "\nclone:" + clone);//arr:[1,4] clone:[1,2,3,4]
但是,以上两种数组复制的操作都不适合对数组中包括复杂数据类型的数据,如果数组中包括复杂数据类型的数据,对这些数据的修改仍然会同时影响复制数组与被复制数组。所以它并不是一个彻底的能实现深层复制的处理思路。
测试代码:
var arr = [1,2,[1,2,3],4];
var clone = arr.slice(0);
arr[2].splice(1,1);//删除从位置1开始的两个元素
alert("arr:" + arr + "\nclone:" + clone);//arr:[1,2,1,3,4] clone:[1,2,1,3,4]
如果想要实现深层的对象复制,可以采用下面这个通用的实现对象克隆的函数:
来源:http://www.cnblogs.com/birdshome/archive/2005/03/20/122246.html
Object.prototype.clone = function()
{
var objClone;
if ( this.constructor == Object ) objClone = new this.constructor();
else objClone = new this.constructor(this.valueOf());
for ( var key in this )
{
if ( objClone[key] != this[key] )
{
if ( typeof(this[key]) == 'object' )
{
objClone[key] = this[key].Clone();
}
else
{
objClone[key] = this[key];
}
}
}
objClone.toString = this.toString;
objClone.valueOf = this.valueOf;
return objClone;
}