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

我只是在问速度。


当前回答

正如@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 cloned_array = [].concat(target_array);

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

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));

正如@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 srcArray = [1, 2, 3];
var clonedArray = srcArray.length === 1 ? [srcArray[0]] : Array.apply(this, srcArray);

长度检查是必需的,因为当只使用一个参数调用Array构造函数时,它的行为会有所不同。

我整理了一个简短的演示:http://jsbin.com/agugo3/edit

我在Internet Explorer 8上的结果是156、782和750,这表明切片在这种情况下要快得多。