复制数组:
javascript中操作对象与java一样采用引用的方式,所以如果通过obj2 = obj1的方式进行数组复制的时候,无论对obj2还是obj1所做的修改都同时影响两个变量的值,从而引发不愿意看到的后果。下面介绍两种实现简单数组元素复制的方法。
(1) 借用slice()进行数组的复制
slice() 函数可从已有的数组中返回选定的元素。使用语法为:
Js代码
- arrObject.slice(start,end); //start,开始位置;end,结束位置
arrObject.slice(start,end); //start,开始位置;end,结束位置
slice()函数将会返回一个新的数组对象,所以使用slice(0)就可以实现数组的复制.
测试代码:
Js代码
1. var arr = [1,2,3,4];
2. var clone = arr.slice(0);
3. arr.splice(1,2);//删除从位置1开始的两个元素
4. alert("arr:" + arr + "\nclone:" + clone);//arr:[1,4] clone:[1,2,3,4]
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]
Javascript代码
1. var a;
2. a = new Array("a","b","c","d","e");
3. document.write(a.slice(0,3) + "<br>");
4. document.write(a.slice(-3,4) + "<br>");
5. document.write(a.slice(0,-1) + "<br>");
6. document.write(a.slice(1) + "<br>");
7. document.write(a.slice(4,3));
var a;
a = new Array("a","b","c","d","e");
document.write(a.slice(0,3) + "<br>");
document.write(a.slice(-3,4) + "<br>");
document.write(a.slice(0,-1) + "<br>");
document.write(a.slice(1) + "<br>");
document.write(a.slice(4,3));
这个示例用到了数组(Array)对象的Slice(start,[end])方法,该方法返回一个新数组,包含了源函数从start到 end 所指定的元素,但是不包括end元素,比如a.slice(0,3);如果 start 为负,将它作为 length + start处理,此处 length 为数组的长度,比如a.slice(-3,4),相当于a.slice(2,4)。如果 end 为负,就将它作为 length + end 处理,此处 length 为数组的长度,比如a.slice(0,-1)。如果省略 end ,那么 slice 方法将一直复制到源数组结尾,比如a.slice(1)。如果 end 出现在 start 之前,不复制任何元素到新数组中,比如a.slice(4,3)。
(2) 借用concat()函数进行数组的复制
concat() 用于进行数组的合并。使用语法为:
Js代码
- arrayObject.concat(arrayX,arrayX,......,arrayX)
arrayObject.concat(arrayX,arrayX,......,arrayX)
concat()用于多个数组的合并,但是返回的结果是一个新的数组,而不再引用用于合并的任何一个数组。可以利用它的这个特性来用一个数组连接空数组或直接不传参数完成clone的功能.
测试代码:
Js代码
1. var arr = [1,2,3,4];
2. var clone = arr.concat();
3. arr.splice(1,2);//删除从位置1开始的两个元素
4. alert("arr:" + arr + "\nclone:" + clone);//arr:[1,4] clone:[1,2,3,4]
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]
但是,以上两种数组复制的操作都不适合对数组中包括复杂数据类型的数据,如果数组中包括复杂数据类型的数据,对这些数据的修改仍然会同时影响复制数组与被复制数组。所以它并不是一个彻底的能实现深层复制的处理思路。
测试代码:
Js代码
1. var arr = [1,2,[1,2,3],4];
2. var clone = arr.slice(0);
3. arr[2].splice(1,1);//删除从位置1开始的两个元素
4. alert("arr:" + arr + "\nclone:" + clone);//arr:[1,2,1,3,4] clone:[1,2,1,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]
如果想要实现深层的对象复制,可以采用下面这个通用的实现对象克隆的函数:
Js代码
1. 来源:
2. Object.prototype.clone = function()
3. {
4. var objClone;
5. if ( this.constructor == Object ) objClone = new this.constructor();
6. else objClone = new this.constructor(this.valueOf());
7. for ( var key in this )
8. {
9. if ( objClone[key] != this[key] )
10. {
11. if ( typeof(this[key]) == 'object' )
12. {
13. objClone[key] = this[key].Clone();
14. }
15. else
16. {
17. objClone[key] = this[key];
18. }
19. }
20. }
21. objClone.toString = this.toString;
22. objClone.valueOf = this.valueOf;
23. return objClone;
24. }