好吧,这更像是一个计算机科学问题,而不是一个基于特定语言的问题,但是map操作和foreach操作之间有区别吗?或者它们只是同一事物的不同名称?
当前回答
array . prototype .map方法和array . prototype . foreach方法都非常相似。
运行如下代码:http://labs.codecademy.com/bw1/6#:workspace
var arr = [1, 2, 3, 4, 5];
arr.map(function(val, ind, arr){
console.log("arr[" + ind + "]: " + Math.pow(val,2));
});
console.log();
arr.forEach(function(val, ind, arr){
console.log("arr[" + ind + "]: " + Math.pow(val,2));
});
它们给出了完全相同的结果。
arr[0]: 1
arr[1]: 4
arr[2]: 9
arr[3]: 16
arr[4]: 25
arr[0]: 1
arr[1]: 4
arr[2]: 9
arr[3]: 16
arr[4]: 25
但当你运行以下代码时,扭转就来了:-
这里我只是简单地分配了map和forEach方法返回值的结果。
var arr = [1, 2, 3, 4, 5];
var ar1 = arr.map(function(val, ind, arr){
console.log("arr[" + ind + "]: " + Math.pow(val,2));
return val;
});
console.log();
console.log(ar1);
console.log();
var ar2 = arr.forEach(function(val, ind, arr){
console.log("arr[" + ind + "]: " + Math.pow(val,2));
return val;
});
console.log();
console.log(ar2);
console.log();
现在的结果有些棘手!
arr[0]: 1
arr[1]: 4
arr[2]: 9
arr[3]: 16
arr[4]: 25
[ 1, 2, 3, 4, 5 ]
arr[0]: 1
arr[1]: 4
arr[2]: 9
arr[3]: 16
arr[4]: 25
undefined
结论
array .prototype.map返回一个数组,但array .prototype. foreach不返回。因此,您可以在传递给map方法的回调函数中操作返回的数组,然后返回它。
foreach只遍历给定的数组,所以你可以在遍历数组时做你的事情。
其他回答
如果你特别谈论Javascript,区别在于map是一个循环函数,而forEach是一个迭代器。
当您希望对列表的每个成员应用操作并将结果作为新列表返回时,使用map,而不影响原始列表。
当您想在列表的每个元素的基础上做一些事情时,请使用forEach。例如,您可能正在向页面添加内容。从本质上讲,当你想要“副作用”时,它是很好的。
其他区别:forEach不返回任何内容(因为它实际上是一个控制流函数),传入函数获得对索引和整个列表的引用,而map返回新的列表,只传入当前元素。
不同。
Foreach遍历一个列表,并对每个列表成员执行一些具有副作用的操作(例如将每个成员保存到数据库中)
Map遍历一个列表,转换该列表的每个成员,并返回另一个具有已转换成员的相同大小的列表(例如将字符串列表转换为大写)
最“明显”的区别是map将结果累积到一个新的集合中,而foreach仅用于执行本身。
但这里有一些额外的假设:因为map的“目的”是新的值列表,所以执行顺序并不重要。事实上,一些执行环境会生成并行代码,甚至引入一些记忆来避免调用重复值,或者引入惰性来避免调用一些值。
另一方面,Foreach是专门用于副作用的;因此顺序很重要,而且通常不能并行。
下面是一个Scala中使用列表的例子:map返回列表,foreach不返回任何内容。
def map(f: Int ⇒ Int): List[Int]
def foreach(f: Int ⇒ Unit): Unit
map返回函数f作用于每个列表元素后得到的列表:
scala> val list = List(1, 2, 3)
list: List[Int] = List(1, 2, 3)
scala> list map (x => x * 2)
res0: List[Int] = List(2, 4, 6)
Foreach只是对每个元素应用f:
scala> var sum = 0
sum: Int = 0
scala> list foreach (sum += _)
scala> sum
res2: Int = 6 // res1 is empty
array . prototype .map方法和array . prototype . foreach方法都非常相似。
运行如下代码:http://labs.codecademy.com/bw1/6#:workspace
var arr = [1, 2, 3, 4, 5];
arr.map(function(val, ind, arr){
console.log("arr[" + ind + "]: " + Math.pow(val,2));
});
console.log();
arr.forEach(function(val, ind, arr){
console.log("arr[" + ind + "]: " + Math.pow(val,2));
});
它们给出了完全相同的结果。
arr[0]: 1
arr[1]: 4
arr[2]: 9
arr[3]: 16
arr[4]: 25
arr[0]: 1
arr[1]: 4
arr[2]: 9
arr[3]: 16
arr[4]: 25
但当你运行以下代码时,扭转就来了:-
这里我只是简单地分配了map和forEach方法返回值的结果。
var arr = [1, 2, 3, 4, 5];
var ar1 = arr.map(function(val, ind, arr){
console.log("arr[" + ind + "]: " + Math.pow(val,2));
return val;
});
console.log();
console.log(ar1);
console.log();
var ar2 = arr.forEach(function(val, ind, arr){
console.log("arr[" + ind + "]: " + Math.pow(val,2));
return val;
});
console.log();
console.log(ar2);
console.log();
现在的结果有些棘手!
arr[0]: 1
arr[1]: 4
arr[2]: 9
arr[3]: 16
arr[4]: 25
[ 1, 2, 3, 4, 5 ]
arr[0]: 1
arr[1]: 4
arr[2]: 9
arr[3]: 16
arr[4]: 25
undefined
结论
array .prototype.map返回一个数组,但array .prototype. foreach不返回。因此,您可以在传递给map方法的回调函数中操作返回的数组,然后返回它。
foreach只遍历给定的数组,所以你可以在遍历数组时做你的事情。
推荐文章
- 为什么不使用异常作为常规的控制流呢?
- 列表推导式和函数式函数比for循环更快吗?
- 什么是序列化?
- 在python3中有'foreach'函数吗?
- “for”和“each”在Ruby中
- 每个递归都可以转换成迭代吗?
- 什么是ORM,它是如何工作的,我应该如何使用它?
- 我能在服务器端应用程序(PHP、Ruby、Python等)上读取URL的哈希部分吗?
- 多少个参数是太多?
- JavaScript: .forEach()和.map()的区别
- 对于不可变集合上的非突变“add”方法,最好的名称是什么?
- 如何用动态规划确定最长递增子序列?
- foo到底是什么意思?
- TypeScript for…的索引/键?
- Linq风格的“For Each”