foreach和map的区别(map和forEach)
scala中map和foreach的区别
Scala中的集合对象都有foreach和map两个方法。两个方法的共同点在于:都是用于遍历集合对象,并对每一项执行指定的方法。而两者的差异在于:foreach无返回值(准确说返回void),map返回集合对象。见如下代码及运行结果:b.getClass 得到的是void, 而c.getClass得到的是colletion 。再看代码的第9-11行,foreach和map的运行结果一致。结论就是:foreach 无法代替map. 而map方法却可以代替foreach。
问题:为什么scala提供foreach和map两个方法呢?本人看法是scala做为一种支持函数式编程范式的语言,必然要引入一种机制以支持数学中函数概念,而在数学中函数就是映射,所以scala中有map方法一点都不奇怪。而foreach只是用在不需要对集合执行映射操作,但需要遍历集合时才用到。总而言之,foreach用于遍历集合,而map用于映射(转换)集合到另一个集合。
[java]?view plain?copy
object?arrayTest?extends?App{
var?increase=(x:Int)=x+1
val?someNumbers?=?List?(?-11,?-10,?-?5,?0,?5,?10)
var?b?=?someNumbers.foreach(increase)
println(b.getClass)
var?c?=?someNumbers.map(increase)
println(c.getClass)
c.foreach((x:Int)=print(x+"?"))
println()
c.map((x:Int)=print(x+"?"))
}
map()和forEach()
forEach()方法中的function回调支持三个参数,第一个是遍历的内容,第二个是索引,第三个是数组本身。即
这里的map是“映射”的意思,基本用法跟forEach类似,但是可以把原数组映射成一个新的数组。比如:
支持return返回值,return的是啥,相当于把数组的这一项变成啥。
1、map速度比forEach快。
2、map会返回一个新数组,不会对原数组产生影响;而forEach不会产生新的数组,只会返回endefined。
3、map因为返回数组,所以可以进行链式操作。
4、map里可以用return,forEach不能;forEach不能用break。
forEach和map有什么区别
map是循环一个数组然后返回一个值组成新的数组;1[1,2,3].map(function(v){return v*v}); //返回[1,4,9]forEach只是循环数组,无返回值(相当于for循环);reduce是循环一个数组,然后组合成一个值1[1,2,3].reduce(function(prv,v){return prev+v}); //返回6
JS的forEach和map方法的区别,还有一个$each
forEach()和map()两个方法都是ECMA5中Array引进的新方法,主要作用是对数组的每个元素执行一次提供的函数,但是它们之间还是有区别的。jQuery也有一个方法$.each(),长得和forEach()有点像,功能也类似。但是从本质上还是有很大的区别的,那么我们探探究竟。
一、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。
map和forEach的区别和用法
相同:forEach和map方法里每次执行匿名函数都支持3个参数,参数分别是item-当前项,index当前项索引值,array原数组;
不同:
map
1.map方法返回一个新的数组,数组中的元素为原始数组调用函数处理后的值。
2.map方法不会对空数组进行检测,若arr为空数组,则map方法返回的也是一个空数组,map方法不会改变原始数组。
3.浏览器支持:chrome、Safari1.5+、opera都支持,IE9+
运行结果
forEach
1.forEach方法用来调用数组的每个元素,将元素传给回调函数
2.forEach对于空数组是不会调用回调函数的,即没有返回值。
运行结果
性能上来说forforEachmap
但是选用方法时不用太过考虑性能,一般简单遍历用forEach,对会产生有规律的变化的新数组时用map