javascript - 在 JavaScript 中复制数组的最快方法 - 切片与 'for' 循环

标签 javascript arrays duplicates copy slice

为了在 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 包含对对象的引用,则不会克隆对象,但只会复制引用,并且因此两个数组都将引用相同的对象。 但这不是这个问题的重点。

我只问速度。

最佳答案

至少有 6 (!) 种克隆数组的方法:

  • 循环
  • 切片
  • Array.from()
  • 连接
  • 扩展运算符(最快)
  • map A.map(function(e){return e;});

有一个huuuge BENCHMARKS thread ,提供以下信息:

  • 对于 blink 浏览器 slice() 是最快的方法,concat() 有点慢,而 while 循环 慢了 2.4 倍。

  • 对于其他浏览器 while 循环 是最快的方法,因为这些浏览器没有对 sliceconcat 的内部优化.

2016 年 7 月仍然如此。

下面是一些简单的脚本,您可以将它们复制粘贴到浏览器的控制台中,然后运行多次以查看图片。它们输出毫秒,越低越好。

while 循环

n = 1000*1000;
start = + new Date();
a = Array(n); 
b = Array(n); 
i = a.length;
while(i--) b[i] = a[i];
console.log(new Date() - start);

切片

n = 1000*1000;
start = + new Date();
a = Array(n); 
b = a.slice();
console.log(new Date() - start);

请注意,这些方法会克隆 Array 对象本身,但数组内容是通过引用复制的,不会被深度克隆。

origAr == clonedArr //returns false
origAr[0] == clonedArr[0] //returns true

关于javascript - 在 JavaScript 中复制数组的最快方法 - 切片与 'for' 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3978492/

相关文章:

Javascript 将方法分配给数组值

javascript - Object.is 与 ===

r - 如何删除r中data.table中的所有重复行

arrays - NodeJS : Extracting duplicates from Array

java - 为什么打印 Integer array Object 给出哈希码而 char array object 在 java 中给出值?

java - 调用 line.isEmpty() 方法时出现重复的答案输出

javascript - 当溢出设置为滚动/自动时,位置粘性不适用于表头

javascript - return 语句在 javascript try block 中不起作用

python - 使用 bool 数组掩码,将 False 值替换为 NaN

ios - 用于遍历数组中的属性