如何形象地解释 JavaScript 中 map、foreach、reduce 间的区别？
它们的输入都是一个数组。如果你需要一个元素一一对应的输出，你就用map，输出结果必然是一个长度一样的数组。如果你需要的输出不是一个等长数组（或者根本不是数字），那你只能用reduce。这是你唯一需要的信息，用来判断你该用什么。

如果你不需要输出任何东西，你只是想遍历每一个元素，你可以用 forEach。你可以用 map 来做一样的事情，然后扔掉它返回的数组。

如果你把 map 返回的等长数组看作一个单一的对象，而不是一个等长的数组，根据上述规则你可以用 reduce 来实现同样的结果。所以，你可以用 reduce来实现 map，你可以用 map 来实现 forEach，本质上你只需要 reduce。

当然，reduce 的思维模式对很多人来说太不直观了，所以必须要有 map 和 forEach。此外，用 reduce 自行实现的 map 和forEach 的性能可能不如原生的好。