for循环是底层可控的通用结构,支持break/continue、手动索引管理、无函数调用开销;forEach是数组方法,不可中断、语义化强但有性能损耗。

JavaScript 主要有 for、forEach、for...in、for...of 四种常用循环方式,适用场景各不相同。其中 for 和 forEach 最常被拿来对比,核心差异不在“能不能遍历”,而在于设计定位、控制能力和运行机制。
for 循环:底层可控的通用循环结构
for 是 JavaScript 最原始的循环语法,不依赖任何对象方法,靠手动管理索引和条件运行。
- 可遍历数组、类数组、字符串(需手动处理)、甚至自定义逻辑序列
- 支持 break 提前退出、continue 跳过当前轮次、return(在函数内)终止整个函数
- 没有额外函数调用开销,性能更优,尤其在大数据量或高频执行场景中明显
- 需要自己写
i = 0; i ,代码稍冗长,易出边界错误(如写成)
forEach:专为数组设计的迭代方法
forEach 是 ES5 为 Array 原型添加的方法,本质是“对数组每一项执行一次回调”,属于声明式遍历。
- 只适用于 数组(以及部分类数组需手动转换),不能直接遍历普通对象或 Map/Set
- 回调函数接收
(item, index, array)三个参数,语义清晰,写法简洁 - 不支持 break / continue / return 中断循环——return 只退出当前回调,不影响后续迭代
- 内部有函数调用、闭包创建等开销,性能略低于 for;但小数组下差异几乎不可测
- 遍历开始后,数组长度变化或新增元素不会影响已启动的遍历过程
for...in 和 for...of 的定位补充
它们不是 forEach 的替代品,而是解决不同问题:
立即学习“Java免费学习笔记(深入)”;
- for...in 遍历对象的可枚举属性名(包括原型链上的),也兼容数组但会把索引当字符串,且顺序不保证,不推荐用于数组
- for...of 遍历 可迭代对象(Array、String、Set、Map、NodeList 等),返回的是值而非键,支持 break/continue,是 for 和 forEach 之外更现代、更安全的选择
怎么选:看需求,不看流行度
不需要中断?想写得干净?用 forEach。要提前退出、处理稀疏数组、做复杂索引运算、或性能敏感?选 for。要遍历 Map 或字符串?用 for...of。要查对象有哪些字段?用 for...in(注意过滤 hasOwnProperty)。











