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

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

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

【问题讨论】:

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

标签: javascript jquery loops foreach underscore.js


【解决方案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

    其他区别:

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

    【讨论】:

    • Jquery 不使用本机 foreach(如果可用)?谢谢,我不知道
    • this 的值也不同。 jQuery 的行为不符合标准,下划线的行为。下划线允许您使用第三个参数设置 this 值。
    猜你喜欢
    • 2013-08-06
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 2016-03-29
    相关资源
    最近更新 更多