map生成新数组,forEach只遍历不返回有效值;map用于数据转换并返回全新数组,需return;forEach用于副作用操作,返回undefined,不可链式调用。

map 生成新数组,forEach 只遍历不返回有用值(返回 undefined)——这是最核心的区别。选哪个,关键看你要不要“基于原数组产出一个新数组”。
map:需要转换数据、构造新数组时用
它对原数组每个元素执行函数,把每次的返回值收集起来,组成并返回一个**全新数组**,原数组不变。
- 适合做数据格式转换:比如把数字数组转成字符串数组、对象数组提取某个字段、给每个元素加前缀等
- 必须有 return;没 return 或 return undefined,新数组对应位置就是 undefined
- 链式调用友好,可接 filter、reduce 等其他数组方法
例子:// 把 [1,2,3] 变成 ['1','2','3']
const nums = [1, 2, 3];
const strings = nums.map(n => String(n)); // ['1','2','3']
forEach:只做副作用操作,不关心返回结果时用
它也遍历每个元素并执行函数,但**不收集返回值,也不生成新数组**,返回值固定是 undefined。常用于发请求、改 DOM、往外部数组 push、打印日志等。
- 适合执行动作(side effect),比如调接口、更新页面、写入全局变量
- 不能链式调用;想“边遍历边筛选再转换”,用 map/filter 组合更清晰
- 别指望用 forEach 的返回值做判断或赋值——它永远是 undefined
例子:// 打印每个用户,并触发通知
users.forEach(user => {
console.log(user.name);
notify(user.id);
});
常见误用和坑
- 想用 forEach 构造新数组却忘了声明空数组并 push —— 这时该用 map
- 在 map 里写 console.log 却没 return,结果得到 [undefined, undefined, ...] —— map 要靠 return 填新数组
- 用 forEach 想链式调用 .filter(),发现报错 —— 因为 forEach 返回 undefined,不是数组
- 性能上无本质差异,别为“快一点”强行替换,语义正确更重要
一句话决策流程
- 你要一个跟原数组等长的、经过处理的新数组?→ 用 map
- 你只是想“对每个元素做点事”,不产出新数组?→ 用 forEach
- 你需要中断遍历(如找到就停)?→ 两者都不行,改用 for...of 或 for 循环











