在JavaScript中复制数组的最快方法——使用slice和'for'循环对比

775
为了在JavaScript中复制一个数组:以下哪种方法更快?

Slice方法

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

我只是在询问速度。


5
这是一个用于比较常见数组复制方法性能的基准测试。 - EscapeNetscape
请参见 javascript - Copy array by value - Stack Overflow --(该问题中的某些答案进行了性能比较) - user202729
有人尝试过使用返回所需数组的特定函数进行基准测试吗?例如,const getInitialArray = () => {return [[1, 2], [3, 4]} - rybo111
有人尝试过使用返回所需数组的特定函数进行基准测试吗?例如 const getInitialArray = () => {return [[1, 2], [3, 4]} - undefined
25个回答

2
一种简单的解决方案:
original = [1,2,3]
cloned = original.map(x=>x)

1
你可以跟着这段代码走。不可变的方式克隆数组。这是克隆数组的完美方式。

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

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

1

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

#1:array1copy = [...array1];

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

#3:array1copy = array1.slice();

如果您的数组对象包含一些JSON不可序列化的内容(函数、Number.POSITIVE_INFINITY等),最好使用

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


1
如果您想在JS中获得一个真正的克隆对象/数组,并具有所有属性和子对象的克隆引用:
export function clone(arr) {
    return JSON.parse(JSON.stringify(arr))
}

所有其他操作都不会创建克隆,因为它们只是改变根元素的基本地址,而不是包含对象的基本地址。

除非您递归遍历对象树。

对于简单的复制,这些操作是可以的。对于存储地址相关的操作,我建议(在大多数情况下,因为这很快!)将其类型转换为字符串,并在一个全新的对象中进行转换。


0
如果你在谈论“slice”,它用于从数组中复制元素并创建具有相同数量或更少数量的克隆。

var arr = [1, 2, 3 , 4, 5];

function slc() {
  var sliced = arr.slice(0, 5);
// arr.slice(position to start copying master array , no. of items in new array)
  console.log(sliced);
}
slc(arr);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接