浅谈Javascript中的forEach和map之间的区别
在Javascript中数组的迭代最常用的两个函数:forEach
和map
。可能很多人认为这两个函数在工作方式上是相同的,它们都进行迭代并输出数组的每一项。本文就来介绍一下forEach
和map
的差异,并因此加深对两个函数的理解。
forEach
forEach
方法是一个高阶函数,因为它接受回调作为它的参数。它用于遍历数组元素,并且返回undefined
。回调函数接受三个参数(元素、值和索引)。
来看下面的代码示例:
const arrAges = [10, 20, 30, 40];
// ES5:
const es5Result = arrAges.forEach(function (item) {
return item * 2;
});
console.log(es5Result); // undefined
console.log(arrAges); // [ 10, 20, 30, 40 ]
// ES6:
const es6Result = arrAges.forEach((item) => item * 2);
console.log(es6Result); // undefined
console.log(arrAges); // [ 10, 20, 30, 40 ]
从执行的结果来看,上面的forEach函数执行的结果打印出来的都是undefined
,执行完后并没有对数组 arrAges
进行任何改动。
forEach
函数不接受将其他方法附加到它。 看下面的示例:
const es6Result = arrAges.forEach((item) => item * 2).reduce((a, b) => a + b);
// 异常,Cannot read property 'reduce' of undefined
console.log(es6Result);
map
map函数用于遍历数组元素。它接受一个回调函数作为参数,根据回调函数返回一个新数组和新元素。
回调函数接受三个参数(元素、值和索引)。
来看下面的代码示例:
const arrAges = [10, 20, 30, 40];
// ES5:
const es5Result = arrAges.map(function (item) {
return item * 2;
});
console.log(es5Result); // [ 20, 40, 60, 80 ]
// ES6:
const es6Result = arrAges.map((item) => item * 2);
console.log(es6Result); // [ 20, 40, 60, 80 ]
从执行结果来看,在数组上使用map
函数返回一个数值翻倍的值作为元素的新数组。从上面的执行结果可以看出,map
函数执行的结果还能附加其他方法。
如下代码:
const arrAges = [10, 20, 30, 40];
// ES6:
const es6Result = arrAges.map((item) => item * 2).reduce((a, b) => a + b);
console.log(es6Result); // 200
上面的示例,对map
函数执行后的结果的数组进行reduce函数将所有元素值相加得到一个结果。关于map和reduce的妙用,可以参见《悟透前端:javascript数组之includes、reduce》
区别
从上面的示例,也看出一点不一样。
forEach
- 遍历完后返回
undefined
。 - 它不接受附加其他方法。
map
- 遍历后返回一个新数组
- 它接受附加其他函数
结论
如上所见,这些是forEach
和map
之间的差异。就我而言,我更喜欢使用map
方法,因为它返回一个新的不同数组。当然,如果不需要返回的数组,则使用forEach
更好。