优先使用缓存长度的for循环,即for (let i = 0, len = arr.length; i
优化大规模数组遍历,核心是减少开销、避开陷阱、按需选型。性能差异在万级及以上数据中会明显放大,尤其在高频执行或资源受限环境(如移动端、动画帧)中尤为关键。
优先用缓存长度的 for 循环
这是目前最稳定、最快的方式,尤其适合纯读取、条件中断或索引依赖操作(如访问
arr[i]和arr[i+1])。
- 写法上推荐
for (let i = 0, len = arr.length; i —— 缓存 <code>length避免每次查属性,现代引擎虽对未缓存场景做了优化,但若循环中可能修改数组长度(如push/splice),缓存就变成必需- 直接通过索引访问元素,无函数调用、无迭代器封装、无作用域创建,CPU 对计数循环有深度优化
- 支持
break/continue,遇到首个匹配项即可退出,避免全量遍历慎用 forEach 和 map/filter/reduce
它们语义清晰、代码简洁,但不是为性能设计的——适用于逻辑简单、数据量不大(通常
forEach每次迭代都新建函数作用域,隐式调用回调,无法中断;实测比优化 for 慢 2–5 倍(数组超 1000 元素时更显著)map必然分配新数组内存,哪怕你只关心第一个转换结果;filter().map()是典型双遍历,等价于一次 for 中判断 + 推入,后者更快且更省内存reduce在简单累加(如求和)时不如 for 直观高效;但在聚合嵌套结构(如树形扁平化、分组统计)时,可读性优势可覆盖微小性能损失for-of 要看使用方式
for (const x of arr)对普通数组已优化良好,语法干净,支持break/continue,适合只需值、不依赖索引的场景。
- 性能介于优化 for 和 forEach 之间,比 forEach 快,但略慢于传统 for(V8 中有少量迭代器对象开销)
- 不要用于
TypedArray(如Uint32Array)——for-of会触发包装器创建,反而比传统 for 慢 20% 以上;此时必须用for (let i = 0; i- 绝对不用
for-in遍历数组:它枚举字符串键、顺序不确定、还会遍历原型链,既慢又不可靠根据数据类型选择底层结构
如果数组全是数字,且不涉及动态增删,考虑用
TypedArray替代普通number[]。
Uint32Array或Float64Array配合传统 for 循环,比普通数组快 3–10 倍——因内存连续、无类型检查、无装箱开销- 注意:
TypedArray不支持push/pop等动态方法,长度固定;也不该用forEach,它会降级为通用迭代路径,失去底层优势- 若需频繁增删,优先保证逻辑正确性,再评估是否值得重构为预分配数组 + 游标管理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南












