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

IT技术 javascript arrays loops foreach
2021-02-02 19:45:48

我知道有很多这样的话题。而且我知道基础知识:.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更改值bto undefined
如果这是一个愚蠢的问题,我很抱歉,但我对这种语言很陌生,到目前为止我找到的答案并没有让我满意。

6个回答

他们不是一回事。让我解释一下区别。

forEach:这会遍历一个列表,并对每个列表成员应用一些具有副作用的操作(例如:将每个列表项保存到数据库中)并且不返回任何内容。

map:这将迭代一个列表,转换该列表的每个成员,并返回另一个与转换成员大小相同的列表(例如:将字符串列表转换为大写)。它不会改变调用它的数组(尽管如果传递一个回调函数,它可能会这样做)。

参考

Array.prototype.forEach() - JavaScript | MDN

Array.prototype.map() - JavaScript | MDN

映射返回列表和 forEach 不是。
2021-03-27 19:45:48
就像 Xufox 说的 - .forEach 不返回任何东西,就是这样。感谢帮助!我会在 10 分钟内标记这个答案。
2021-04-09 19:45:48
  • Array.forEach “每个数组元素执行一次提供的函数。”

  • Array.map “创建一个新数组,其结果是对该数组中的每个元素调用提供的函数。”

所以,forEach实际上并没有返回任何东西。它只是为每个数组元素调用函数,然后就完成了。因此,您在该被调用函数中返回的任何内容都将被简单地丢弃。

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

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

值得注意的是:在 2015 年,forEachmap需要forEach在旧浏览器(IE8 或 9)上支持 polyfill相比,这将“更有效”是有争议的您不需要将 return 分配map给任何东西;mapmap未分配返回值时,返回值应在返回后立即被垃圾回收
2021-03-16 19:45:48
@cowbert 仅仅因为某些东西被立即垃圾收集,并不意味着您不会受到必要的分配的影响。因此,forEach概念上仍然是更有效率和更适合那些不需要收集结果的任务。我不了解你,但在 2015 年,我不再为 IE8 开发(顺便说一句。也不支持map);和 IE9+ 支持forEach实际上,在我回答一个月后,微软终止了对这些浏览器的支持。
2021-03-19 19:45:48
forEach 和 map 是否都保证以相同的顺序处理元素?
2021-03-19 19:45:48
@Quentin2 是的,而且,这两个函数都是同步的,因此只有在循环遍历整个数组并为每个函数调用回调后mapforEach调用才会返回。
2021-03-26 19:45:48
forEach() 地图()
功能 对数组的每个元素执行给定的操作 对每个元素的“副本”执行给定的“转换”
返回值 退货 undefined 返回具有转换元素的新数组,保留原始数组不变。
优选使用场景和示例 对每个元素执行类似处理的非转换。

例如,保存数据库中的所有元素。
获取包含对数组的每个元素进行的某些处理的输出的数组。

例如获取数组中每个字符串的长度数组

forEach() 例子

chars = ['Hello' , 'world!!!'] ;
    
var retVal = chars.forEach(function(word){
  console.log("Saving to db: " + word) 
})
  
console.log(retVal) //undefined

map() 例子

 chars = ['Hello' , 'world!!!'] ;
    
 var lengths = chars.map(function(word){
   return word.length
 }) 
    
 console.log(lengths) //[5,8]

编辑您的帖子并显示实际文本而不是图像。其他人无法从您的图像中复制和粘贴,或在您的图像中搜索,或帮助改进图像中的文本内容。有关详细信息,请参见此处谢谢你。
2021-03-28 19:45:48
这可能会帮助您绘制 ASCII 艺术表:webapps.stackexchange.com/q/6700/126269
2021-04-08 19:45:48

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

阅读:

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

性能分析 随着数组中元素数量的增加,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');
这是我电脑上的结果: map: 1642ms forEach: 885ms for: 748ms
2021-03-13 19:45:48
这个测试不是很科学。它需要测试他们都做同样的事情。map 正在构建一个数组,foreach 正在就地编辑一个数组,for 循环也在就地修改另一个数组。当我修改测试以实际执行相同的操作时,map 比 foreach 快。
2021-03-29 19:45:48
我认为它在用于“我需要对每个数组元素做一些事情,我应该使用什么?”的情况下是科学的。问题。对于所有操作的直接比较,那么您是对的,但是对于来这里询问 map 是否比 forEach 仅循环更快的人来说,这是一个有value的答案。
2021-04-09 19:45:48