我知道有很多这样的话题。我知道基本原理:. 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。 如果这是一个愚蠢的问题,我很抱歉,但我对这门语言很陌生,到目前为止我找到的答案并不能让我满意。


当前回答

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

Let array = []; For (var I = 0;I < 20000000;我+ +){ array.push(我) } console.time(“映射”); 数组中。映射(num => { 返回num * 4; }); console.timeEnd(“映射”); console.time (' forEach '); 数组中。forEach((num, index) => { 返回数组[index] = num * 4; }); console.timeEnd (' forEach '); console.time(“的”); For (i = 0;I < array.length;我+ +){ 数组[i] =数组[i] * 2; } console.timeEnd(“的”);

其他回答

它们不是一回事。让我来解释一下其中的区别。

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

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

参考文献

Array.prototype.forEach() - JavaScript | MDN

Array.prototype.map() - JavaScript | MDN

Map返回一个新数组。

forEach没有返回值。

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

forEach ():

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


map ():

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


结论:

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

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

Let array = []; For (var I = 0;I < 20000000;我+ +){ array.push(我) } console.time(“映射”); 数组中。映射(num => { 返回num * 4; }); console.timeEnd(“映射”); console.time (' forEach '); 数组中。forEach((num, index) => { 返回数组[index] = num * 4; }); console.timeEnd (' forEach '); console.time(“的”); For (i = 0;I < array.length;我+ +){ 数组[i] =数组[i] * 2; } console.timeEnd(“的”);

Foreach和map的区别:

Map():如果你使用Map,那么Map可以通过迭代主数组返回新的数组。

Foreach():如果你使用Foreach,那么它不能为每个can迭代主数组返回任何东西。

有用的链接:使用这个链接来理解差异

https://codeburst.io/javascript-map-vs-foreach-f38111822c0f