`_.forEach` 和 `$.each` 之间的区别 [关闭]
Posted
技术标签:
【中文标题】`_.forEach` 和 `$.each` 之间的区别 [关闭]【英文标题】:The difference between `_.forEach` and `$.each` [closed] 【发布时间】:2012-11-29 05:45:35 【问题描述】:这两个函数,_.forEach
和 $.each
,分别取自 underscore
和 jQuery
似乎做了同样的事情。
选择一种实现而不是另一种实现的可能原因是什么?
【问题讨论】:
我不会根据单一方法来决定采用哪个框架... 下划线不是框架 使用下划线版本。它遵循标准。 【参考方案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` 之间的区别 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI ForEach Binding 编译时错误看起来不像 for-each
$.each()和$().each(),以及forEach()的用法