我知道有很多这样的话题。我知道基本原理:. foreach()操作原始数组,.map()操作新数组。

在我的例子中:

function practice (i){
    return i+1;
};

var a = [ -1, 0, 1, 2, 3, 4, 5 ];
var b = [ 0 ];
var c = [ 0 ];
console.log(a);
b = a.forEach(practice);
console.log("=====");
console.log(a);
console.log(b);
c = a.map(practice);
console.log("=====");
console.log(a);
console.log(c);

这是输出:

[ -1, 0, 1, 2, 3, 4, 5 ]
=====
[ -1, 0, 1, 2, 3, 4, 5 ]
undefined
=====
[ -1, 0, 1, 2, 3, 4, 5 ]
[ 0, 1, 2, 3, 4, 5, 6 ]

我不明白为什么使用practice会改变b的值为undefined。 如果这是一个愚蠢的问题,我很抱歉,但我对这门语言很陌生,到目前为止我找到的答案并不能让我满意。


当前回答

forEach()和map()的区别

forEach()只是循环遍历元素。它会丢弃返回值并且总是返回undefined。此方法的结果不提供输出。

Map()循环遍历元素,通过迭代主数组分配内存并存储返回值

例子:

   var numbers = [2,3,5,7];

   var forEachNum = numbers.forEach(function(number){
      return number
   })
   console.log(forEachNum)
   //output undefined

   var mapNum = numbers.map(function(number){
      return number
   })
   console.log(mapNum)
   //output [2,3,5,7]

map()比forEach()快

其他回答

不同之处在于他们的回报。执行后:

arr.map()

返回由已处理函数生成的元素数组;而:

arr.forEach()

返回未定义。

.map和. foreach会做同样的事情,直到你开始对拥有数百万个元素的数组进行操作。.map会创建另一个具有相同大小(可能还有类型,这取决于数组的种类)的集合,这可能会占用大量内存。

Map返回一个新数组。

forEach没有返回值。

这就是区别的核心。这里的大多数其他答案都有效地说明了这一点,但以一种更复杂的方式。

数组中。forEach“对每个数组元素执行一次所提供的函数。” 数组中。Map“创建一个新数组,其中包含对该数组中的每个元素调用所提供的函数的结果。”

forEach实际上不返回任何东西。它只是为每个数组元素调用函数,然后就完成了。所以无论你在被调用的函数中返回什么都会被丢弃。

另一方面,map将类似地为每个数组元素调用函数,但它不会丢弃它的返回值,而是捕获它并构建一个包含这些返回值的新数组。

这也意味着你可以在使用forEach的任何地方使用map,但你仍然不应该这样做,这样你就不会毫无目的地收集返回值。如果你不需要它们,不收集它们会更有效率。

forEach ():

返回值:undefined originalArray:方法调用后未修改 方法调用结束后不会创建newArray。


map ():

返回值:新数组,在调用数组中的每个元素上调用所提供函数的结果 originalArray:方法调用后未修改 在方法调用结束后创建newArray。


结论:

因为map构建了一个新的数组,所以当你不使用返回的数组时使用它是一种反模式;用forEach或for-of代替。