“它”指代forEach,与map的根本区别在于:forEach专注执行副作用且不返回新数组,map专注一对一映射并强制返回等长新数组;前者适合触发行为,后者适合构造数据。

“它”指代的是 forEach,与 map 在语义上最根本的区别在于:前者是遍历并执行副作用,后者是转换并生成新数据。
forEach:专注执行,不产出新数组
forEach 的设计目的就是逐个访问元素,完成日志打印、发起请求、修改外部变量、操作 DOM 等动作。它不返回有意义的值(返回 undefined),也不关心结果是否构成新结构。
- 适合场景:触发行为,而非构造数据
- 常见误用:用 forEach 想“得到一个新数组”,结果发现变量仍是 undefined
- 例子:arr.forEach(x => console.log(x * 2)) —— 只打印,没生成新数组
map:专注映射,强制返回新数组
map 的核心语义是“一对一变换”:对原数组每个元素应用函数,严格按顺序返回一个等长的新数组。它不修改原数组,也不执行副作用(即使写了,也只是附带)。
- 适合场景:格式转换、字段提取、JSX 渲染前的数据准备
- 关键约束:回调函数必须有返回值,否则新数组对应位置为 undefined
- 例子:arr.map(x => x * 2) —— 明确产出 [2,4,6,...]
语义差异直接影响代码可读性与可维护性
看到 forEach,读者预期“这里在做事情”;看到 map,读者预期“这里在准备数据”。混用会破坏意图表达:
- 用 map 发起请求:逻辑重心错位,易被误认为在构造数据
- 用 forEach 构造列表:丢失函数式语义,后续无法链式处理(如再 filter 或 reduce)
- 真正需要“边遍历边收集”的场景,应考虑 for...of 或 reduce,而非强行套用 forEach

















