原文链接 有删节
javascript中的 map 和 forEach 方法有什么共同点和区别呢?

也许你在工作中已经接触到了 Array.prototype.map() 和 Array.prototype.forEach() 那么他们有什么不同呢?
Map & ForEach 的定义
首先,我们开一下 MDN上的定义
- forEach()) 方法对数组的每个元素执行一次提供的函数。
- map()方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。
具体是什么意思呢?forEach()方法不会返回任何有用的值,他的返回值是 undefined。forEach 方法按升序为数组中含有效值的每一项执行一次callback 函数,在这个回调函数中允许你去改变原来的数组。map()方法会给原数组中的每个元素都按顺序调用一次 callback 函数。不同点是callback 每次执行后的返回值(包括 undefined)组合起来形成一个新数组。示例
考虑下面的一个数组,如果我们想让数组的每一项的值变成原来的两倍,我们可以用map和forEach1let arr = [1, 2, 3, 4, 5];
forEach
注意:你不能从 forEach 通过 return 返回你想要的值,return 的值会被自动忽略。
code
result
map
code
result
性能
下面的图片展示了测试性能

真如你所看到的,在我的电脑上 forEach() 比 map() 慢了70%,根据电脑配置和浏览器不同,这个测试结果会有差异,你可以在jsPerf上运行这个测试用例。
函数式编程的考虑
函数式编程是一件非常有意思的事情。
如果你喜欢函数式编程,那么理解 map() 方法是很重要的。因为 forEach() 方法很可能会改变原来的数组,map() 则会返回一个新的数组 ,保证原数组不会被修改。
谁才是更好的选择呢?
这就要看你的需求了。
对于 ForEach(),如果你不想更改数组中的数据,而是想用它做一些事情,比如将其保存到数据库或在控制台输出,那么他是一个不错的选择。
在需要更改数据时,map() 可能更可取。 它不仅速度更快,而且返回一个新的数组。 这意味着我们可以和其他方法(map(),filter(),reduce()等)一起实现链式调用。
上面的方法,我们先 把 arr 的每一项变成原来的两倍,然后再过滤出 大于5的元素,最后得到一个新的数组 arr2
总结
map()会分配内存并存储返回的值,forEach()返回的值永远是 undefinedforEach()允许你再回调函数中改变原来的数组,map()则会返回一个新的数组。