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