.map,.every和.forEach有什么区别?


118

我一直想知道它们之间有什么区别。他们似乎都在做同一件事...


6
有人加了jQuery的标签......考虑everyforEach不jQuery的方法,我认为这是不可能的问题涉及到jQuery的任何方式。developer.mozilla.org/en/JavaScript/New_in_JavaScript/1.6
James Allardice 2011年

我认为此链接应该具有您正在寻找的答案。
zBomb 2011年

我是否认为您是在指新的Mozilla特定的数组方法(如我先前评论中的链接中所述)?
James Allardice 2011年

@James- 这些不是Mozilla特定的。我也将共享一个指向Webkit和Opera文档的链接,但我不知道它们在我头上的位置。
gilly3 2011年

@ gilly3-啊,好点。我相信它们仅在IE9中受支持,而在下面则不受支持。
James Allardice 2011年

Answers:


224

区别在于返回值。

.map() 返回通过对原始项目执行某些操作而创建的新对象数组

.every() 返回一个布尔值 -如果此数组中的每个元素都满足提供的测试功能,则返回 true。与的一个重要区别.every()是,可能不一定总是为数组中的每个元素都调用测试函数。一旦测试函数对任何元素返回false,就不再迭代数组元素。因此,测试功能通常应该没有副作用

.forEach() 不返回任何内容 -迭代Array,对Array中的每个项目执行给定的操作。

在MDN上了解这些以及其他许多Array迭代方法


另外,也可以引用MDN
JoshWillik 2014年

3
@josh-我确实引用了MDN。每个方法名称都链接到其在MDN上的相应文档。
gilly3,2014年

@ gilly3,很抱歉,我掩盖了蓝色文字>。>
JoshWillik 2014年

.forEach()现在没有返回错误,也许不是在2012年,但至少在2015年的Chrome浏览器中,请尝试使用此arr2 = ['sue','joe','ben','guy','tom','jon ']; b = arr2.forEach(function(el,indx){console.log(indx +':'+ el);}); console.log(b);
杰森2015年

1
@EugeneMercer“原始项目”是指数组中每个元素的原始值。
gilly3

88

gilly3的答案很好。我只是想添加一些有关其他类型的“循环遍历元素”功能的信息。

  • .every() (在迭代器第一次返回false或false时停止循环)
  • .some() (在迭代器第一次返回true或真值时停止循环)
  • .filter() (创建一个新的数组,其中包含filter函数返回true的元素,并忽略其中返回false的元素)
  • .map() (根据迭代器函数返回的值创建一个新数组)
  • .reduce() (通过重复调用迭代器并传入先前的值来构建值;有关详细信息,请参见规范;对汇总数组内容和许多其他内容很有用)
  • .reduceRight() (如减少,但按降序而不是升序工作)

归功于:TJCrowder 在JavaScript中通过数组实现For-each?


从我这里获得100个赞!
Shamim

6

对上述最佳答案的另一个考虑是链接。使用forEach(),您不能链接,但是使用map(),则可以。

例如:

var arrayNumbers = [3,1,2,4,5];

arrayNumbers.map(function(i) {
    return i * 2
}).sort();

使用.forEach(),您将无法执行.sort(),但会收到错误消息。


0

对于Ramda,之间的区别R.map(),并R.forEach()为:

  1. R.forEach()返回原始数组,而R.map()返回一个函子
  2. R.forEach()只能在数组上操作,但R.map()也可以在对象上操作(即,对象的键/值对被视为数组)

问题与Java语言有关。Ramda虽然很棒,但却是一个完全不同的话题和一个图书馆。
SeaWarrior404 '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.