我们知道,Array.prototype上有一个slice()方法,可以对数组进行克隆,但是这个方法并不完美。如果一个数组是一维数组,使用slice()方法没有任何问题,但如果是一个多维数组,那么这个方法就不是那么完美了。
1 //一维数组的克隆 2 var ary1 = [1,2,3]; 3 var ary2 = ary1.slice(); 4 console.log( ary1 === ary2 ) ; // false,ary1和ary2的引用地址不一样,互不影响
有些时候,我们想复制一个内容一样,但互不影响的数组,单纯使用slice()方法,就不能满足我们的需求了,如下所示:
1 //多维数组的克隆 2 var ary1 = [1,[2,3]; 3 var ary2 = ary1.slice(); 4 console.log (ary1 === ary2 ); // false,ary1和ary2的引用地址不一样,互不影响 5 console.log (ary1[1] === ary2[1] ); // true,slice()仅对第一维进行了克隆,但是第二维并没有克隆,ary1[1]和ary2[1]存储的是同一个数组的引用地址,所以返回true
我们可以使用递归来达到深度克隆的效果。
1 //多维数组的克隆 2 function copyAry(ary){ 3 ary=ary.slice(); //将当前传入的数组进行第一维克隆 4 // 遍历数组 5 for(var i=0;i<ary.length;i++){ 6 // 如果第i项存储的是数组,那么仍然使用copyAry方法进行克隆 7 if(typeof ary[i]===‘Array‘){ 8 ary[i]=copyAry(ary[i]); 9 } 10 } 11 // 返回克隆后的数组 12 return ary; 13 }
时间: 2024-10-19 10:55:24