关于数组的深度克隆(未完待续)

Posted fxf111

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于数组的深度克隆(未完待续)相关的知识,希望对你有一定的参考价值。

我们知道,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 }

 

以上是关于关于数组的深度克隆(未完待续)的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 进阶(未完待续)

未完待续综述:用于视频分割(Video Segmentation)的深度学习

给深度学习研究生的入门建议(未完待续ing)

关于闭包(未完待续)

漫谈回溯(未完待续)

关于DOM的一些总结(未完待续......)