用 forEach 当只需执行副作用操作(如打印、发请求、修改外部变量),它不返回有效值;用 map 当需生成新数组(如提取字段、格式化、计算),它返回等长新数组且不改变原数组。

遍历数组时,forEach 用于执行副作用操作(比如打印、发请求、修改外部变量),map 专用于生成一个新数组,不改变原数组,且必须有返回值。
什么时候用 forEach?
当你只需要“做点事”,并不需要结果数组时,选 forEach。它不返回任何有意义的值(返回 undefined),也不支持链式调用。
- 遍历并打印每个元素:
arr.forEach(item => console.log(item)) - 批量触发 API 请求:
users.forEach(user => fetch(`/api/user/${user.id}`)) - 累积统计信息:
let sum = 0; arr.forEach(n => sum += n)
什么时候用 map?
当你想把原数组“转换”成另一个数组(比如取属性、格式化、计算),就用 map。它会返回一个等长的新数组,原数组不变。
- 提取对象字段:
users.map(u => u.name) - 数字翻倍:
[1,2,3].map(x => x * 2)→[2,4,6] - 生成带 id 的新对象:
items.map((item, i) => ({...item, id: i + 1}))
别混淆:forEach 不能替代 map
写 arr.forEach(x => x * 2) 不会得到新数组,只是白算一遍。想得到变换后的数组,必须用 map。反过来,如果只想要副作用却用了 map,不仅浪费内存(生成无用数组),还可能误导后续逻辑——别人看到 map 会默认你在做数据转换。
立即学习“Java免费学习笔记(深入)”;
其他常见误区提醒
forEach 无法用 break 或 return 中断遍历(可用 some/every 替代部分场景);map 要求每次回调必须有返回值,漏写 return 会导致新数组里出现 undefined。










