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

我只是在问速度。


当前回答

克隆数组有几种方法。基本上,克隆可以分为两类:

浅拷贝 深拷贝

浅拷贝只覆盖数组的第一级,其余的都是 引用。如果需要数组中嵌套元素的真实副本,则需要 深克隆。

例子:

const arr1 = [1,2,3,4,5,6,7]           
// Normal Array (shallow copy is enough)     
const arr2 = [1,2,3,[4],[[5]],6,7]          
// Nested Array  (Deep copy required) 


Approach 1 : Using (...)Spread Operator  (Shallow copy enough)
const newArray = [...arr1] // [1,2,3,4,5,6,7]

Approach 2 : Using Array builtIn Slice method (Deep copy)  
const newArray = arr1.slice()  // [1,2,3,4,5,6,7]

Approach 3 : Using Array builtIn Concat method (Deep a copy)
const newArray = [].concat(arr1)  // [1,2,3,4,5,6,7]

Approach 4 : Using JSON.stringify/parse. (Deep a copy & fastest)
const newArray = JSON.parse(JSON.stringify(arr2));)  // [1,2,3,[4],[[5]],6,7]

Approach 5: Using own recursive function or using loadash's __.cloneDeep method. (Deep copy)

其他回答

克隆数组至少有6种方法:

循环 片 Array.from () concat 扩展语法(最快) map(函数(e){返回e;});

有一个巨大的基准线程,提供以下信息:

对于闪烁的浏览器,slice()是最快的方法,concat()稍慢,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.slice();
console.log(new Date() - start);

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

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

这取决于浏览器。如果你在博客文章array .prototype.slice vs手动创建数组,有一个粗略的性能指南:

结果:

在JavaScript中快速复制数组的方法:

第1集:

#2: array1copy = array1.slice(0);

#3: array1copy = array1.slice();

如果数组对象包含一些json不可序列化的内容(函数,Number。POSITIVE_INFINITY等)更好地使用

array1copy = JSON.parse(JSON.stringify(array1))

如果你是关于切片,它是用来从数组复制元素,并创建一个克隆相同的编号。或者更少的元素。的元素。

Var arr = [1,2,3,4,5]; 函数slc() { Var切片= arr。片(0 5); / /加勒比海盗。切片(开始复制主数组的位置,没有。新数组中的项) console.log(切片); } slc (arr);

您可以遵循这段代码。不可变方式数组克隆。这是克隆数组的最佳方法


const array = [1, 2, 3, 4]

const newArray = [...array]
newArray.push(6)
console.log(array)
console.log(newArray)