JavaScript:.forEach()和.map()之间的区别
JavaScript: Difference between .forEach() and .map()
我知道有很多这样的主题。我知道一些基本知识:.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
:它迭代一个列表,转换该列表的每个成员,并返回另一个与转换后的成员大小相同的列表(例如:将字符串列表转换为大写)。它不会改变调用它的数组(尽管回调函数可能会这样做)。
参考
Array.prototype.forEach()-JavaScript|MDN
Array.prototype.map()-JavaScript|MDN
Array.forEach
"每个数组元素执行一次所提供的函数。"Array.map
"创建一个新数组,其结果是在此数组中的每个元素上调用所提供的函数。"
因此,forEach
实际上并没有返回任何内容。它只是为每个数组元素调用函数,然后就完成了。因此,在被调用的函数中返回的任何内容都将被丢弃。
另一方面,map
将类似地为每个数组元素调用函数,但它不会丢弃其返回值,而是捕获它并构建这些返回值的新数组。
这也意味着,无论您在哪里使用forEach
,都可以使用map
,但您仍然不应该这样做,因此您不会在没有任何目的的情况下收集返回值。如果你不需要它们,不收集它们会更有效率。
forEach() | 映射() | |
---|---|---|
功能 | 对数组的每个元素执行给定的操作 | 执行给定的";变换";在";复制";每个元素的 |
返回值 | 返回undefined | 返回包含已转换元素的新数组,保留原始数组不变 |
首选使用场景和示例 | 对每个元素执行非变形处理 例如,保存数据库中的所有元素 | 获取数组,该数组包含对数组的每个元素进行的某些处理的输出 例如,获取数组中每个字符串的长度数组 |
您需要知道的主要区别是.map()
返回一个新数组,而.forEach()
不返回。这就是你在输出中看到这种差异的原因。.forEach()
只是对数组中的每个值进行运算。
读取:
Array.prototype.forEach()
-JavaScript|MDNArray.prototype.map()
-JavaScript|MDN
您可能还想查看:-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
返回一个新数组。
forEach
没有返回值。
这就是区别的核心。这里的大多数其他答案都有效地说明了这一点,但方式要复杂得多。
forEach:如果你想对数组的元素执行一个操作,它与你用于循环的操作相同。这个方法的结果不会给我们一个输出buy-just循环通过元素。
map:如果您想对数组的元素执行操作,并且还想将操作的输出存储到数组中。这类似于函数中的for循环,该函数在每次迭代后返回结果。
希望这能有所帮助。
forEach():
返回值:未定义
originalArray:在方法调用后未修改
newArray不是在方法调用结束后创建的。
map():
返回值:new数组,填充调用数组中每个元素上提供的函数的结果
originalArray:在方法调用后未修改
newArray是在方法调用结束后创建的。
结论:
由于map构建了一个新的数组,所以在不使用返回的数组时使用它是一种反模式;使用forEach或for代替。
区别在于它们返回的内容。执行后:
arr.map()
返回从所处理的函数得到的元素数组;而:
arr.forEach()
返回undefined。
forEach()与;map()
forEach()只是循环遍历元素。它丢弃返回值,并且总是返回未定义的值。这个方法的结果没有给我们一个输出。
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()快
Foreach和amp;地图:
Map():如果使用Map,则Map可以通过迭代主数组来返回新数组。
Foreach():如果使用Foreach,则它不能为每个can迭代的主数组返回任何内容。
使用Ful链接:使用此链接了解差异
https://codeburst.io/javascript-map-vs-foreach-f38111822c0f
这里没有提到的一个穿梭机区别是forEach()
可以在静态(非活动)NodeList上循环,而map()
不能
//works perfectly
document.querySelectorAll('.score').forEach(element=>console.log(element));
//Uncaught TypeError: document.querySelectorAll(...).map is not a function
document.querySelectorAll('.score').map(element=>console.log(element));
需要指出的一点是,这两个方法都跳过未初始化的值,但map将它们保留在返回的数组中。
var arr = [1, , 3];
arr.forEach(function(element) {
console.log(element);
});
//Expected output: 1 3
console.log(arr.map(element => element));
//Expected output: [1, undefined, 3];
.map和.forEach将做同样的事情,直到您开始在具有数百万元素的数组上操作。map将创建另一个具有相同大小(可能是类型,取决于阵列物种)的集合,这可能会占用大量内存。for Each不会这么做。
性能分析(同样-不太科学)
根据我的经验,.map()有时可能比.foreach()更快
let rows = [];
for (let i = 0; i < 10000000; i++) {
// console.log("here", i)
rows.push({ id: i, title: 'ciao' });
}
const now1 = Date.now();
rows.forEach(row => {
if (!row.event_title) {
row.event_title = `no title ${row.event_type}`;
}
});
const now2 = Date.now();
rows = rows.map(row => {
if (!row.event_title) {
row.event_title = `no title ${row.event_type}`;
}
return row;
});
const now3 = Date.now();
const time1 = now2 - now1;
const time2 = now3 - now2;
console.log('forEach time', time1);
console.log('.map time', time2);
在我的macbook pro上(2013年末)
- 每次1909
- .地图时间444
Map隐式返回,而forEach则不返回
这就是为什么在编写JSX应用程序时,几乎总是使用map而不是forEach来显示React中的内容。
- 全局变量和全局对象的属性之间有什么区别吗
- JavaScript中的函数和对象之间没有区别吗?
- 在下划线中使用_(obj).map(callback)和_.map(obj,callback)之间的区别
- javascript函数的:和=之间的区别
- 什么's本地node.js服务器和python简单http服务器之间的区别
- 函数中this和var之间的区别
- “util.inherits”和在NodeJS中扩展原型之间的区别
- Math.min()和Math.max()之间有什么区别?在Javascript中
- webpack开发模式和生产构建模式之间有什么区别
- servlet和代理servlet之间的区别
- Javascript 类型未定义和 void 之间的区别
- Javascript-defineProperty和直接在对象上定义函数之间的区别
- 关于承诺/A+规范,术语“当时可”和“承诺”之间有什么区别
- 布局引擎和javascript引擎之间的区别
- 什么's extjs中的mon()和on()之间的区别
- type=text/javascript和language=javascript之间的区别
- 函数()和新函数()之间的区别
- JavaScript中let和var之间的区别
- 蓝鸟的done()和spread()之间的区别
- Node.js HTTP/NET——连接和请求之间的区别