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

Slice method

var dup_array = original_array.slice();

For loop

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

我知道这两种方式都只执行shallow copy:如果original_array包含对对象的引用,则不会克隆对象,但只复制引用,因此两个数组都将有对相同对象的引用. 但这不是这个问题的重点.

我只是问速度.

推荐答案

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

  • 大堆from()
  • 合并
  • 扩散运算符(最快)
  • map A.map(function(e){return e;});

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

  • 对于blink个浏览器,片()是最快的方法,合并()稍微慢一点,while 环慢2.4倍.

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

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.片();
console.log(new Date() - start);

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

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

Javascript相关问答推荐

Angular material 表多个标题行映射

如何在不分配整个数组的情况下修改包含数组的行为主体?

为什么getRecord()会因为与_logger相关的错误而失败?(使用Hedera SDK)

如何找出摆线表面上y与x相交的地方?

康威的生活游戏规则在我的Javascript版本中不起作用.''我做错了什么?

编剧如何获得一个div内的所有链接,然后判断每个链接是否都会得到200?

VUE 3捕获错误并呈现另一个组件

使用Java脚本导入gltf场景并创建边界框

Reaction Native中的范围滑块

使用插件构建包含chart.js提供程序的Angular 库?

如何利用CSS中的隐藏元素实现平滑扩展和防止网格行间隙

匹配一个或多个可选重复的特定模式

用于部分字符串的JavaScript数组搜索

使用线性插值法旋转直线以查看鼠标会导致 skip

输入的值的类型脚本array.排序()

在JS/TS中将复杂图形转换为数组或其他数据 struct

Clip-Path在网页浏览器(Mozilla、Edge、Chrome)上不能正常工作,但在预览版Visual Code Studio HTML、CSS、JS上却能很好地工作

我不知道如何纠正这一点.

在Press Reaction本机和EXPO av上播放单个文件

如何用react组件替换dom元素?