for循环最快,因其无函数调用开销、可缓存数组长度、支持break/continue且直接索引访问;forEach次之,因每次迭代需创建函数上下文并传参;map最慢,因额外分配新数组并承担全部高阶函数成本。

for 循环最快,forEach 次之,map 最慢——这是在多数真实场景下可复现的性能排序,尤其当数据量超过几千项时更明显。
为什么 for 循环最快
它不依赖任何函数调用机制,没有额外开销:
- 无回调函数创建、无作用域链查找、无 this 绑定过程
- 可手动缓存 arr.length,避免每次比较都读取属性
- 支持 break 和 continue,提前退出零成本
- 直接通过索引访问元素(
arr[i]),V8 引擎能高效优化
forEach 为什么比 for 慢一点
它语义清晰,但底层仍要执行函数调用:
- 每次迭代都新建一次函数执行上下文
- 传入三个参数(当前值、索引、原数组),涉及参数压栈和作用域初始化
- 无法用 break 中断,想提前退出只能抛错或改用
some/every - 小数组(如
map 为什么最慢
它不只是遍历,还承担“构造新结构”的任务:
- 除 forEach 全部开销外,必须分配一块新内存来存放结果数组
- 每轮迭代都要向新数组写入一项(
result[i] = callback(...)) - 即使只取前几项,整个新数组仍会被完整构建,后续若再遍历它,等于多做一轮操作
- GC 压力更大,尤其在高频循环中易触发垃圾回收
怎么验证这个结论
用 console.time() 在同一环境跑三段逻辑,确保测试数组足够大(建议 ≥10⁵):
const arr = Array.from({ length: 100000 }, (_, i) => i);
console.time('for');
let sum1 = 0;
for (let i = 0; i < arr.length; i++) sum1 += arr[i];
console.timeEnd('for');
console.time('forEach');
let sum2 = 0;
arr.forEach(v => sum2 += v);
console.timeEnd('forEach');
console.time('map');
let sum3 = 0;
arr.map(v => sum3 += v); // 注意:map 不该这么用,仅作对比
console.timeEnd('map');
典型结果(Chrome 125+):for ≈ 0.3ms,forEach ≈ 0.8ms,map ≈ 1.5ms+。差距随数据量增大而拉大。

















