本文深入解析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程序设计有所帮助。