forEach 和 map 的区别是什么?
请说明 forEach 和 map 的核心区别,以及在什么场景下应该使用哪个。
回答
苦行僧
| 特性 | forEach | map |
|---|---|---|
| 返回值 | undefined | 新数组 |
| 链式调用 | ❌(返回 undefined) | ✅(可继续 .filter/.reduce) |
| 修改原数组 | 可间接修改(回调内操作原数组元素) | 不修改原数组 |
| break/continue | ❌(无法跳出),需用 some/every 或 for...of | ❌ |
| async/await | 不支持并行等待 | 同上 |
| 性能 | 略快(无返回数组开销) | 稍慢(创建新数组) |
选择原则:
- 需要返回转换后的数组 → map
- 只需要执行副作用(打印、赋值、DOM 操作)→ forEach
- 需要链式调用 → map
- 需要跳出循环 → some(满足条件返回 true)或 for...of
注意:
- forEach 的回调中无法使用
await按预期工作(不会等待异步完成),若要串行异步使用for...of - 空数组元素在 forEach 和 map 中会被跳过(不调用回调)