`_.forEach` 和 `$.each` 之间的区别 [关闭]

Posted

技术标签:

【中文标题】`_.forEach` 和 `$.each` 之间的区别 [关闭]【英文标题】:The difference between `_.forEach` and `$.each` [closed] 【发布时间】:2012-11-29 05:45:35 【问题描述】:

这两个函数,_.forEach$.each,分别取自 underscorejQuery 似乎做了同样的事情。

选择一种实现而不是另一种实现的可能原因是什么?

【问题讨论】:

我不会根据单一方法来决定采用哪个框架... 下划线不是框架 使用下划线版本。它遵循标准。 【参考方案1】:

jQuery 看起来像:

something.each( function(index, Element) )

下划线看起来像:

_.each(list, function(Element, index, list), [context])
// or
_(list).each(function(Element, index, list), [context])

Native array.forEach 看起来像:

array.forEach(function(Element, index, list), [context])

所以:

下划线保持与原生forEach相同的参数顺序 JQuery 和 Underscore 的实现有两个区别: JQuery 将 this 设置为 Element,本机和下划线允许您提供自己的上下文 本机和下划线还提供列表本身作为回调的第三个参数。

编辑:为什么能够设置上下文很有用?

假设您有某种对象:

var worker = new FooWorker();
worker.process(something);
worker.process(somethingElse);

假设您想对数组中的每个值调用该方法。 使用上下文参数,您可以简单地说:

myArray.forEach(worker.process, worker);

如果没有它,您需要更详细(并且每个元素再调用一次函数):

// native
myArray.forEach( function(i, e) worker.process(e); );
// jquery
$(myArray).each( function() worker.process(this);  );

这是 JQuery 的 foreaching 约定使事情变得不那么方便的一种情况。

【讨论】:

【参考方案2】:

它们都主要提供了 IE8 中没有的 forEach 函数的替代。

如果您对数组进行迭代,它们不会增加太多。

除了回调参数的顺序之外,主要区别在于,在 jQuery 中,该值也可用作回调调用的上下文(这就是为什么值不太重要,只是提供的第二个参数的原因)。除非您真的想避免将参数传递给函数,否则这并不是喜欢它的主要原因:

var product = 1;
$.each([1, 2, 3], function() product *= this );

大多数情况下,您不会同时使用这两个库,因此您只需使用您拥有的库提供的迭代函数即可。

如果你碰巧同时导入了这两个库,我建议使用下划线函数作为

它与数组上的标准 ECMAScript 函数最相似,因此您可以更轻松地在 IE8 失效的那一天进行迁移 它更高效,因为它在可用时使用本机函数:

See source:

...
if (nativeForEach && obj.forEach === nativeForEach) 
     obj.forEach(iterator, context);
...

【讨论】:

下划线也接受普通对象而不是数组。 jsfiddle.net/zdF6D jQuery 的功能集是less 完整的,因为它不允许您通过第三个参数设置回调的this 值。 @IHateLazy 你是对的。我读源太快了…… 我真的希望 jQuery 能够切换它的参数。我可以不用设置回调的this 值,但是翻转的参数让我有点抓狂。 事实上,这令人困惑。我同意这一点。而且你不能总是使用它,因为它可能是装箱的,这一事实禁止你总是简单地使用它。【参考方案3】:

_.forEach$.each 的不同之处在于传递给回调的参数。

如果您使用_.forEach,则传递给回调的第一个参数是值,而不是键。 所以如果你根本不关心密钥,你应该使用_.forEach

其他区别:

    _.forEach 在现代浏览器中使用原生 Arrray.prototype.forEach 会更快一些。 这个值也不同。 jQuery 的行为不符合标准,下划线符合。

【讨论】:

Jquery 不使用本机 foreach(如果可用)?谢谢,我不知道 this 的值也不同。 jQuery 的行为不符合标准,下划线的行为。下划线允许您使用第三个参数设置 this 值。

以上是关于`_.forEach` 和 `$.each` 之间的区别 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

JS的forEach和map方法的区别,还有一个$each

SwiftUI ForEach Binding 编译时错误看起来不像 for-each

$.each()与forEach()的区别,伪数组是啥

$.each()和$().each(),以及forEach()的用法

$.each()和$().each(),以及forEach()的用法

jquery foreach和each的区别