.map、.every 和 .forEach 之间有啥区别?
Posted
技术标签:
【中文标题】.map、.every 和 .forEach 之间有啥区别?【英文标题】:What is the difference between .map, .every, and .forEach?.map、.every 和 .forEach 之间有什么区别? 【发布时间】:2011-11-12 13:02:42 【问题描述】:我一直想知道它们之间的区别是什么。他们似乎都在做同样的事情......
【问题讨论】:
有人添加了 jQuery 标签...考虑到every
和 forEach
不是 jQuery 方法,我认为这个问题不太可能与 jQuery 有任何关系。 developer.mozilla.org/en/javascript/New_in_JavaScript/1.6
我觉得这个link应该有你要找的答案。
我是否认为您指的是新的 Mozilla 特定数组方法,如我之前评论中的链接中详述的那样?
@James - These are not Mozilla specific。我也会分享一个指向 webkit 和 opera 文档的链接,但我不知道它们在哪里。
@gilly3 - 啊,好点子。我相信它们只在 IE9 中受支持,而不是在下面。
【参考方案1】:
区别在于返回值。
.map()
返回一个新的对象数组,该数组是通过对原始项目执行某些操作而创建的。
.every()
返回布尔值 - 如果此数组中的每个元素都满足提供的测试功能,则为 true。与.every()
的一个重要区别是,可能并不总是为数组中的每个元素调用测试函数。一旦测试函数对任何元素返回 false,就不再迭代数组元素。因此,测试函数通常应该没有side effects。
.forEach()
不返回任何内容 - 它迭代数组,为数组中的每个项目执行给定的操作。
了解这些以及许多其他Array iteration methods at MDN。
【讨论】:
也可以引用MDN @josh - 我确实引用了 MDN。每个方法名称都链接到其在 MDN 上的相应文档。 @gilly3,对不起,我把蓝色的文字遮住了>.> .forEach() 现在返回没有任何问题,也许它不是在 2012 年,但至少在 2015 年在 Chrome 中,试试这个 arr2 = ['sue', 'joe', 'ben', 'guy ', '汤姆', '乔恩']; b = arr2.forEach(函数(el, indx) console.log(indx + ' : ' + el); ); console.log(b); @EugeneMercer “原始项”是指数组中每个元素的原始值。【参考方案2】:gilly3 的回答很棒。我只是想添加一些关于其他类型的“循环元素”函数的信息。
.every()
(在迭代器第一次返回 false 或
一些虚假的东西)
.some()
(第一次迭代器停止循环
返回真实或真实的东西)
.filter()
(创建一个新数组
包括 filter 函数返回 true 的元素和
省略返回 false 的部分)
.map()
(根据迭代器返回的值创建一个新数组
函数)
.reduce()
(通过重复调用迭代器建立一个值,
传入以前的值;有关详细信息,请参阅规范;有用
用于对数组的内容和许多其他内容求和)
.reduceRight()
(与 reduce 类似,但以降序而不是降序工作)
升序)
感谢:T.J.Crowder For-each over an array in JavaScript?
【讨论】:
从我这里获得 100 个赞!【参考方案3】:对上述出色答案的另一个考虑是链接。使用 forEach() 你不能链接,但使用 map(),你可以。
例如:
var arrayNumbers = [3,1,2,4,5];
arrayNumbers.map(function(i)
return i * 2
).sort();
使用 .forEach(),你不能做 .sort(),你会得到一个错误。
【讨论】:
【参考方案4】:对于Ramda,R.map()
和R.forEach()
的区别是:
R.forEach()
返回原始数组,而 R.map()
返回一个
函子
R.forEach()
只能对数组进行操作,但R.map()
也可以对对象进行操作(即处理对象的键/值对
像一个数组)
【讨论】:
问题与 Javascript 语言有关。 Ramda 虽然很棒,但它是一个完全不同的主题和一个库。以上是关于.map、.every 和 .forEach 之间有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
JS中some(),every(),forEach(),map(),filter()区别
温习js中的for,forEach,map, some, every用法总结,跳出循环方法
ES5新增 数组操作forEach()map()filter()some()every()
ES5新增 数组操作forEach()map()filter()some()every()