.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 标签...考虑到 everyforEach 不是 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()

every();some();filter();map();forEach()各自区别:

温习js中的for,forEach,map, some, every用法总结,跳出循环方法