一、forEach和map语法
语法:
//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.1、forEach()返回值是undefined,不可以链式调用。
2.2、map()返回一个新数组,原数组不会改变。
2.3、没有办法终止或者跳出forEach()循环,除非抛出异常,所以想执行一个数组是否满足什么条件,返回布尔值,可以用一般的for循环实现,或者用Array.every()或者Array.some()
2.4、$.each()方法规定为每个匹配元素规定运行的函数,可以返回 false 可用于及早停止循环。
三、经典例子
3.1 在使用forEach()时候,如果数组在迭代的视乎被修改,
则其他元素会被跳过。因为 forEach()不会在迭代之前创建数组的副本。
3.2反转字符串
var str = '12345'
Array.prototype.map.call(str, function(x) { //同时利用了call()方法
return x
}).reverse().join('')
3.3一个笔试题。
1
["1", "2", "3"].map(parseInt) //结果 [1, NaN, NaN]
如果想得到[1, 2,3]应该这么做
function returnInt(element){
return parseInt(element,10)
}
["1", "2", "3"].map(returnInt)
这主要是因为 parseInt()默认有两个参数,第二个参数是进制数。当parsrInt没有传入参数的时候,而map()中的回调函数时候,会给它传三个参数,第二个参数就是索引,明显不正确,所以返回NaN了。
3.4....
四、兼容性
forEach()和map()是ECMA5新引入的,可能在标准的其他实现中不存在,在使用前可以要Ployfill一下。
具体网上很多吧,更多的是在ie9以下,如果你的项目无视这些,那么你可以不care。
可以使用JavaScript的Array.prototype.forEach()方法中的index参数来判断是否循环到最后一次,index参数表示当前正在处理的元素的索引,可以与Array.length进行比较,如果相等,则表示已经处理到最后一个元素。例如:
let arr = [1, 2, 3, 4, 5]
arr.forEach(function(item, index) {
if (index === arr.length - 1) {
console.log('This is the last item!')
}
})