JS中Array深拷贝几种方法比较

最近在使用node.js做服务器相关的工作,恰好遇到数组Array的复制问题:填充一段buffer,buffer的头3位根据目前的设计是固定的。用伪码表示:

var copyed = source.deepcopy
copyed.push()

Javascript中提供的方法

经过查询文档,发现有以下几种方法:

source.slice()//1
Array.from(source)//2
source.concat()//3
[...source]//4

那么自然产生一个问题,哪一种省时?接下来,就进行测试。

测试

因为测试的问题比较简单,没有考虑是否多核等因素,只是根据业务需要进行了两种测试。一种只是数组Array的复制,另一种则是数组Array复制完后进行"写"操作。第一种测试的代码形如:

const a = [1,2,3];
var start = new Date().getTime();
console.log(start);
for (var i = 100000; i >= 0; i--) {
    var b = a.slice();
    //b.push('s');
};
var end = new Date().getTime();
console.log(end);
console.log(end - start);

测试结果:

method i=10000 i=100000
slice 20 35
from 39 206
concat 20 35
... 27 48

另一种测试将上述注释的代码加上,结果如下:

method i=10000 i=100000
slice 45 260
from 38 220
concat 58 283
... 25 50

从结果来看,两种前提的测试下from所需的时间最多。单纯复制数组,slice和concat消耗时间最少;复制完再添加元素的情况下,...语法表现最好。