📖 简介
在 JavaScript 中,我们经常需要生成从 1 到 n 的数字数组。常见的方法包括 for 循环、Array.from、fill + map 以及 new Array().map()等。但在实际应用中,不同方法的性能差异如何?最传统的 for 循环真的最快吗?而最慢的方法又是哪一个?本篇文章将通过性能测试深入探讨这些问题,并给出最优解。
📌 摘要
- 目标 :对比 JavaScript 中几种生成
1 ~ n数组的方法,找出最高效和最慢的方案。 - 方法 :
for循环、Array.from、fill + map、new Array().map()等。 - 结果 :
for循环在大数据量情况下最优,而某种常见方法的性能表现却意外最差! - 适用场景:不同方法适用于不同需求,本文将给出推荐方案。
📌 正文
🚀 1. 代码实现
在 JavaScript 中,生成 1 ~ n 数组的方法有很多,我们挑选其中 5 种常见方式进行对比。
javascript
const num = 1000000; // 100万数据量
// 方法 1:Array.from
function generateArray1(num) {
return Array.from({ length: num }, (_, index) => index + 1);
}
// 方法 2:new Array() + map
function generateArray2(num) {
return new Array(num).fill(0).map((_, index) => index + 1);
}
// 方法 3:for 循环(最高效)
function generateArray3(num) {
const result = [];
for (let i = 1; i <= num; i++) {
result.push(i);
}
return result;
}
// 方法 4:fill() + map()
function generateArray4(num) {
return Array(num)
.fill()
.map((_, index) => index + 1);
}
// 方法 5:展开运算符 + map
function generateArray5(num) {
return [...new Array(num)].map((_, index) => index + 1);
}
// 性能测试
console.time('Array.from');
generateArray1(num);
console.timeEnd('Array.from');
console.time('new Array + map');
generateArray2(num);
console.timeEnd('new Array + map');
console.time('for loop');
generateArray3(num);
console.timeEnd('for loop');
console.time('fill + map');
generateArray4(num);
console.timeEnd('fill + map');
console.time('Array + map');
generateArray5(num);
console.timeEnd('Array + map');
📊 2. 性能测试结果
我们在 Chrome 浏览器(V8 引擎)上运行测试,得到如下结果(时间单位:ms):
| 方法 | 代码实现 | 执行时间(ms) |
|---|---|---|
| 方法 3 | for 循环 |
🏆 最快 |
| 方法 1 | Array.from |
较快 |
| 方法 2 | new Array().fill().map() |
一般 |
| 方法 4 | Array(num).fill().map() |
一般 |
| 方法 5 | [...new Array()].map() |
❌ 最慢 |
(具体测试数据在不同环境下可能有所不同,建议自行测试验证。)
📌 3. 结果分析
✅ for 循环(方法 3):最高效
- 原因 :直接使用
push添加元素,避免了fill()和map()额外的遍历。 - 适用场景:大数据量时建议使用。
✅ Array.from(方法 1):较快
- 原因 :
Array.from是优化过的底层实现,直接创建数组并填充数据。 - 适用场景 :代码简洁,性能接近
for循环。
⚠️ fill + map(方法 2、4):性能一般
- 原因 :
fill()需要预填充数组,再map()遍历一次,导致多了一次迭代。 - 适用场景:适用于小规模数据,避免大规模使用。
❌ [...new Array()].map()(方法 5):最慢
- 原因 :扩展运算符
...会创建一个新的数组,再map()遍历,额外的内存分配使其成为最慢的方法。 - 适用场景 :❌ 不建议使用,性能损失严重。
📌 4. 结论与推荐
| 需求 | 推荐方法 |
|---|---|
| 最佳性能(大数据量) | ✅ for 循环 |
| 代码简洁 + 高性能 | ✅ Array.from |
| 适用于小规模数据 | ⚠️ fill + map |
| ❌ 避免使用 | ❌ [...new Array()].map() |
🔥 总结:
for循环是最快的,适用于大规模数据处理。Array.from代码最简洁,适用于大部分场景。fill + map方法适用于小数据量,但性能稍逊。- 避免使用
[...new Array()].map(),它是最慢的!
你是否有更快的方法?欢迎留言讨论!🚀