Array.from和for循环生成数组的性能对比

首先思考一个问题,如何生成一个[0,1,2…97,98,99]的数组?
一般第一时间想到的肯定是for循环跑一下,完事了。但是有没有什么奇淫技巧实现呢,答案是有的。Array.from({ length: 100 }, (v, i) => i),那么一起看下这个Array.from是什么。

Array.from

Array.from() 方法从一个类似数组或可迭代的对象中创建一个新的数组实例。

语法

Array.from(arrayLike[, mapFn[, thisArg]])

参数

arrayLike
想要转换成真实数组的类数组对象或可遍历对象。

mapFn 可选
可选参数,如果指定了该参数,则最后生成的数组会经过该函数的加工处理后再返回。

thisArg 可选
可选参数,执行 mapFn 函数时 this 的值。

返回值

一个新的 Array 实例

Array.from其实就是可以把一个具有length属性的对象,或者是可遍历对象(iterable),转换成一个数组。
ok,用法了解了,那么for循环生成和Array.from生成两者的性能如何呢?在此,我做了个时间对比:

1
2
3
4
5
6
7
8
9
10
11
12
for (var i = 0; i < 10; i++) {
console.time(`Array.from第${i+1}次`)
Array.from({ length: 100 }, (e, index) => index)
console.timeEnd(`Array.from第${i+1}次`)
console.time(`for循环第${i+1}次`)
var arr = []
for (var j = 0; j < 100; j++) {
arr[j] = j
}
console.timeEnd(`for循环第${i+1}次`)
}

为了公平,测试的时候跑十次,结果也会相对稳定准确,结果如下:

还测试了生成1000个元素的时间对比:

这是生成 1000000个元素的时间对比:

可以看到当生成的个数越多,for循环的性能比Array.from的性能更高,普遍在2-9倍不等,当然这个数值可能有些许误差,但是无疑for循环略胜一筹。low的代码性能不一定差, 逼格高的代码也不一定就好,但是至少你想的出后者,可以说明你的思维和知识面够广。

菜鸟学习笔记,如有不对,还希望高手指点。如有造成误解,还希望多多谅解。

著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。