为了在JavaScript中复制数组:下面哪个使用更快?

片的方法

var dup_array = original_array.slice();

For循环

for(var i = 0, len = original_array.length; i < len; ++i)
   dup_array[i] = original_array[i];

我知道这两种方法都只做一个浅拷贝:如果original_array包含对对象的引用,对象将不会被克隆,但只有引用将被复制,因此两个数组将有对相同对象的引用。 但这不是问题的关键。

我只是在问速度。


当前回答

那我们的方式呢?

arr2 = [...arr1];

其他回答

看看:link。重点不是速度,而是舒适度。此外,正如你所看到的,你只能在原始类型上使用slice(0)。

要制作数组的独立副本,而不是对其引用的副本,可以使用数组切片方法。

例子:

To make an independent copy of an array rather than a copy of the refence to it, you can use the array slice method. var oldArray = ["mip", "map", "mop"]; var newArray = oldArray.slice(); To copy or clone an object : function cloneObject(source) { for (i in source) { if (typeof source[i] == 'source') { this[i] = new cloneObject(source[i]); } else{ this[i] = source[i]; } } } var obj1= {bla:'blabla',foo:'foofoo',etc:'etc'}; var obj2= new cloneObject(obj1);

来源:链接

正如@Dan所说:“这个答案很快就过时了。使用基准测试来检查实际情况”,有一个特定的答案从jsperf没有自己的答案:while:

var i = a.length;
while(i--) { b[i] = a[i]; }

有960,589次操作/秒,亚军a.c concat()为578,129次操作/秒,占60%。

这是最新的64位Firefox(40)。


@aleclarson创建了一个新的、更可靠的基准。

克隆对象数组的最快方法是使用展开运算符

var clonedArray=[...originalArray]
or
var clonedArray = originalArray.slice(0); //with 0 index it's little bit faster than normal slice()

但是克隆数组中的对象仍然指向旧的内存位置。因此改变到clonedArray对象也会改变orignalArray。所以

var clonedArray = originalArray.map(({...ele}) => {return ele})

这不仅将创建新的数组,而且还将克隆对象。

免责声明,如果你正在使用嵌套对象,在这种情况下,展开操作符将工作为浅克隆。在这一点上最好使用

var clonedArray=JSON.parse(JSON.stringify(originalArray));

那我们的方式呢?

arr2 = [...arr1];

深度克隆数组或对象的最简单方法:

var dup_array = JSON.parse(JSON.stringify(original_array))