JS中forEach与map方法的用法及核心区别详解

作者:代码拾荒

时间:2026-10-22

浏览:503

本文深入解析JavaScript中ECMAScript 5新增的数组遍历方法forEach和map。详细对比两者在语法结构、返回值特性、链式调用支持以及循环终止能力上的差异,并通过具体代码示例说明迭代修改、字符串反转及parseInt陷阱等实际应用场景,最后简述兼容性处理建议。

文章目录

本文详细解析JavaScript中forEach和map方法的实际应用与核心差异,旨在为开发者提供清晰的参考指南。

一、前言

forEach()和map()均为ECMAScript 5规范中引入的数组新方法,主要用于对数组每个元素执行指定的回调函数。尽管两者功能相似,但存在显著区别。jQuery库中提供的$.each()方法在外观和基础功能上与forEach()有相似之处,但底层实现机制截然不同,下文将深入剖析其具体差异。

二、forEach和map语法

2.1、语法:


//forEach
array.forEach(callback(currentValue, index, array){
  //do something
}, this)
//或者
array.forEach(callback(currentValue, index, array){
  //do something
})
//map:
var new_array = arr.map(callback[, thisArg])
//$.each()
$(selector).each(function(index,element)) //注意参数的顺序

callback:针对数组中每个元素执行的函数,该函数接收三个参数。

参数一:当前数组元素;参数二:当前元素的索引;参数三:当前数组对象本身。

this:可选参数,用于指定回调函数执行时的this指向。

2.2、区别

2.2.1、forEach()方法的返回值为undefined,因此不支持链式调用。

2.2.2、map()方法会返回一个新数组,且原数组内容保持不变。

2.2.3、forEach()循环无法通过常规方式(如break)终止或跳出,除非抛出异常。若需判断数组元素是否满足特定条件并返回布尔值,建议使用普通for循环,或采用Array.every()与Array.some()方法。

2.2.4、$.each()方法为每个匹配元素执行指定函数,若回调函数返回false,可提前终止循环。

三、一些栗子

3.1 迭代时的修改

在使用forEach()时,若数组在迭代过程中被修改,后续未访问的元素可能会被跳过。这是因为forEach()在迭代开始前不会创建原数组的副本。


var words = ['one', 'two', 'three', 'four'];
words.forEach(function(word) {
 console.log(word);
 if (word === 'two') {
  words.shift();
 }
});
// one
// two
// four

3.2反转字符串


var str = '12345';
Array.prototype.map.call(str, function(x) {  //同时利用了call()方法
 return x;
}).reverse().join('');

3.3一个笔试题。


["1", "2", "3"].map(parseInt); //结果 [1, NaN, NaN]

若期望得到[1, 2, 3]的结果,正确的做法如下:


function returnInt(element){
 return parseInt(element,10);
}
["1", "2", "3"].map(returnInt);

这主要是因为parseInt()默认包含两个参数,其中第二个参数代表进制数。当调用map()的回调函数时,会传入三个参数(当前值、索引、原数组),此时第二个参数即为索引值,导致parseInt解析错误并返回NaN。

四、兼容性

forEach()和map()属于ECMAScript 5标准新增内容,在某些旧版浏览器或非标准实现中可能缺失,使用前建议进行Polyfill处理。

网络上已有大量相关Polyfill方案,主要针对IE9及以下版本。若项目无需兼容这些旧浏览器,则可忽略此问题。

参考:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/map

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.jb51.net/code/HtmlJsRun测试上述代码运行效果。

PS:这里再为大家推荐一款JS数组遍历方式分析对比工具供大家参考:

在线JS常见遍历方式性能分析比较工具:http://tools.jb51.net/aidedesign/js_bianli

更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript数组操作技巧总结》、《JavaScript遍历算法与技巧总结》、《javascript面向对象入门教程》、《JavaScript数学运算用法总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript错误与调试技巧总结》

希望本文所述对大家JavaScript程序设计有所帮助。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章