JavaScript:.forEach()和.map()之间的区别

Dzi*_*zan 91 javascript arrays foreach loops

我知道有很多这样的话题.我知道基础知识:.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);
Run Code Online (Sandbox Code Playgroud)

这是输出:

[ -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 ]
Run Code Online (Sandbox Code Playgroud)

为什么用我无法理解practice的变化值bundefined.
如果这是一个愚蠢的问题,我很抱歉,但我对这种语言很新,我找到的答案到目前为止并不能让我满意.

Ric*_*ton 116

他们不是同一个人.让我解释一下这个区别.

forEach:迭代列表并将一些带副作用的操作应用于每个列表成员(例如:将每个列表项保存到数据库)

map:迭代列表,转换该列表的每个成员,并返回与转换成员相同大小的另一个列表(例如:将字符串列表转换为大写)

参考

Array.prototype.forEach() - JavaScript | MDN

Array.prototype.map() - JavaScript | MDN

  • map return list 和 forEach not 。好的 (3认同)
  • 就像Xufox所说 - .forEach不返回任何东西,就是这样.感谢帮助!我会在10分钟内标出这个答案. (2认同)

pok*_*oke 50

  • Array.forEach "每个数组元素执行一次提供的函数."

  • Array.map "创建一个新数组,其结果是在此数组中的每个元素上调用提供的函数."

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

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

这也意味着您可以map在任何使用的地方使用,forEach但您仍然不应该这样做,因此您不会在没有任何目的的情况下收集返回值.如果你不需要它们,那么不收集它们会更有效率.

  • @cowbert只是因为某些东西被立即收集垃圾,这并不意味着你没有受到必要的分配的打击.所以`forEach`在概念上*仍然会更高效,更适合你不需要收集结果的任务.我不知道你,但在2015年,我不再为IE8开发了(顺便说一句,也不支持`map`); 和IE9 +支持`forEach`.实际上,在我回答一个月后,微软终止了对这些浏览器的支持. (3认同)

Mah*_*aha 18

+----------------+-------------------------------------+---------------------------------------+
|                | foreach                             | map                                   |
+----------------+-------------------------------------+---------------------------------------+
| Functionality  | Performs given operation on each    | Performs given "transformation" on    |
|                | element of the array                | "copy" of each element                |
+----------------+-------------------------------------+---------------------------------------+
| Return value   | Returns undefined                   | Returns new array with tranformed     |
|                |                                     | elements leaving back original array  |
|                |                                     | unchanged                             |
+----------------+-------------------------------------+---------------------------------------+
| Preferrable    | Performing non-transformation like  | Obtaining array containing output of  |
| usage scenario | processing on each element.         | some processing done on each element  |
| and example    |                                     | of the array.                         |
|                | For example, saving all elements in |                                       |
|                | the database                        | For example, obtaining array of       |
|                |                                     | lengths of each string in the         |
|                |                                     | array                                 |
+----------------+-------------------------------------+---------------------------------------+

  • 这可能会帮助您绘制 ASCII 艺术表:https://webapps.stackexchange.com/q/6700/126269 (4认同)

Rah*_*sai 15

您需要知道的主要区别是.map()返回一个新数组而.forEach()不是.这就是为什么你看到输出的差异..forEach()只对数组中的每个值进行操作.

阅读:

您可能还想看看: - Array.prototype.every()- JavaScript | MDN


小智 11

性能分析 随着数组中元素数量的增加,For 循环的执行速度比 map 或 foreach 快。

let array = [];
for (var i = 0; i < 20000000; i++) {
  array.push(i)
}

console.time('map');
array.map(num => {
  return num * 4;
});
console.timeEnd('map');


console.time('forEach');
array.forEach((num, index) => {
  return array[index] = num * 4;
});
console.timeEnd('forEach');

console.time('for');
for (i = 0; i < array.length; i++) {
  array[i] = array[i] * 2;

}
console.timeEnd('for');
Run Code Online (Sandbox Code Playgroud)

  • 这是我电脑上的结果:`map: 1642ms forEach: 885ms for: 748ms` (3认同)
  • 我认为当用于“我需要对每个数组元素做一些事情,我应该使用什么?”的情况时它是科学的。问题。对于所有操作的直接比较,那么你是对的,但对于来这里询问 map 是否比 forEach 循环更快的人来说,这是一个有价值的答案。 (3认同)

小智 10

forEach()

  • 返回值:未定义

  • OriginalArray :方法调用后未修改

  • 方法调用结束后不会创建 newArray。


地图()

  • 返回值:新数组,其中填充了对调用数组中每个元素调用所提供函数的结果

  • OriginalArray :方法调用后未修改

  • newArray 在方法调用结束后创建。


结论:

由于 map 构建了一个新数组,因此在不使用返回的数组时使用它是一种反模式;使用 forEach 或 for-of 代替。


小智 7

forEach:如果要对Array的元素执行操作,它与用于for循环的操作相同.这种方法的结果并没有给我们一个输出购买只是循环通过元素.

map:如果要对数组的元素执行操作,并且还希望将操作的输出存储到Array中.这类似于在每次迭代后返回结果的函数中的for循环.

希望这可以帮助.


小智 6

不同之处在于它们返回的内容。执行后:

arr.map()
Run Code Online (Sandbox Code Playgroud)

返回由处理函数产生的元素数组;尽管:

arr.forEach()
Run Code Online (Sandbox Code Playgroud)

返回未定义。


Ask*_*ker 5

map 返回一个新数组。

forEach 没有返回值。

这就是差异的核心。这里的大多数其他答案都有效地说明了这一点,但方式要复杂得多。