map返回新数组,forEach返回undefined——这是最根本的区别;map用于生成结构变化的新数组,如类型转换或提取字段;forEach仅适合执行副作用操作,如发请求或绑定事件。
map 返回新数组,forEach 不返回任何值(返回 undefined)——这是最根本的区别,直接决定你能不能链式调用或赋值。
map
当你需要基于原数组生成一个结构变化后的新数组时, ma 是唯一合理选择。它会遍历每个元素,把回调函数的返回值自动收集进新数组。
[1, 2, 3] 转成 ['1', '2', '3']?用 map(String) 或 map(x => x.toString())
id 字段:users.map(u => u.id)
filter、reduce 或赋值给某个变量?只有 map 能提供可用的返回值forEach
forEach 只适合“执行副作用”——比如发请求、改 DOM、往外部数组 push、调用 console.log。它不关心返回什么,也不构造新数组。
items.forEach(item => api.submit(item))
buttons.forEach(btn => btn.addEventListener('click', handler))
forEach 无法用 break 或 return 中断循环(得用 for 或 some/every)map 和 forEach 的性能与兼容性差异两者遍历行为一致,性能几乎没有差别。但有几点实际影响要注意:
map 总是创建一个新数组,哪怕你忽略返回值——内存开销略高,大数据量时别滥用forEach 在 IE9+ 支持;map 同样是 IE9+,但若需兼容 IE8,两个都得用 for 循环替代this,两者表现相同;但如果你在回调里写了 return false,map 会把它当映射结果塞进新数组,forEach 则完全忽略最容易被忽略的是:有人误以为 forEach 能替代 map,手动 push 到空数组里——这不仅多写代码,还失去了函数式表达的清晰性;反过来,用 map 去发请求却不接返回值,又白白分配了一块没用的内存。