foreach只能遍历数组且返回undefined,不支持中断、不生成新数组、不能修改原数组结构、也不能遍历对象等非数组类型。

直接用 forEach 遍历数组很简单,但它不是万能的——写错场景反而会让逻辑出问题。关键要清楚它“能做什么”和“不能做什么”。
怎么正确调用 forEach
它只作用于数组,语法是:arr.forEach(callback)。回调函数默认接收三个参数:
-
当前元素(必填):比如
item,就是数组里正在处理的那个值; -
索引(可选):从
0开始的位置编号,如需定位可用; -
原数组(可选):整个
arr本身,适合需要读取其他项或做边界判断的场景。
示例:
colors.forEach((item, index) => {
console.log(`${index}: ${item}`);
});
// 输出:
// 0: red
// 1: green
// 2: blue
forEach 不能中断遍历
它设计上就不支持 break、continue 或 return 跳出循环体。哪怕在回调里写了 return,也只是退出当前这一次回调,下一项依然会继续执行。
- 想找到第一个满足条件的元素就停?用
some()或find(); - 想遍历到某位置就中止?改用
for循环或for...of; - 误以为
return false能跳出?它什么也不会终止,只是让这次回调提前结束。
它不返回新数组,也不能修改原数组结构
forEach 返回值永远是 undefined,所以不能链式调用,也不能靠它生成新数据。
- 要转换数组(比如把数字全乘 2),该用
map(); - 要筛选数据(比如只留偶数),该用
filter(); - 要在遍历时删除元素?别在 forEach 里用
splice或pop,容易跳过后续项,推荐用filter生成新数组。
它不能遍历对象或其他非数组类型
forEach 是数组原型方法,只认 Array 实例。对普通对象、Map、Set 或类数组(如 arguments)直接调用会报错 is not a function。
- 遍历对象属性:用
for...in(注意原型链)或Object.keys(obj).forEach(); - 遍历
Map/Set:用for...of; - 遍历类数组:先转成真数组,比如
[...arrayLike].forEach()或Array.from(arrayLike).forEach()。











