`_.forEach`和`$ .each`之间的区别

Lor*_*ard 17 javascript foreach jquery loops underscore.js

这两个功能, _.forEach并且$.each,从分别取underscorejQuery似乎使同样的事情.

偏好一个实现到另一个实现的可能原因是什么?

ant*_*njs 16

_.forEach并且$.each传递给回调的参数不同.

如果使用_.forEach,传递给回调的第一个参数是值,而不是键.
所以,如果你不打扰你应该使用的密钥_.forEach.

其他差异:

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


Kos*_*Kos 6

jQuery看起来像:

something.each( function(index, Element) )
Run Code Online (Sandbox Code Playgroud)

下划线看起来像:

_.each(list, function(Element, index, list), [context])
// or
_(list).each(function(Element, index, list), [context])
Run Code Online (Sandbox Code Playgroud)

原生array.forEach看起来像:

array.forEach(function(Element, index, list), [context])
Run Code Online (Sandbox Code Playgroud)

所以:

  • 下划线保持与本机相同的参数顺序 forEach
  • JQuery和Underscore的实现有两点不同:
    • JQuery设置thisElementnative,Underscore允许您提供自己的上下文
    • Native和underscore也将列表本身作为回调的第三个参数.

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

考虑一下你有某种对象:

var worker = new FooWorker();
worker.process(something);
worker.process(somethingElse);
Run Code Online (Sandbox Code Playgroud)

假设您要对数组中的每个值调用该方法.
使用context参数,您可以简单地说:

myArray.forEach(worker.process, worker);
Run Code Online (Sandbox Code Playgroud)

没有它你需要更冗长(并为每个元素再做一次函数调用):

// native
myArray.forEach( function(i, e) {worker.process(e);} );
// jquery
$(myArray).each( function() {worker.process(this); } );
Run Code Online (Sandbox Code Playgroud)

这是JQuery的预告约定使事情变得不那么方便的一种情况.


Den*_*ret 5

它们都主要提供IE8中没有的forEach功能的替代品.

如果你在数组上进行迭代,它们不会增加太多.

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

var product = 1;
$.each([1, 2, 3], function(){ product *= this });
Run Code Online (Sandbox Code Playgroud)

大多数情况下,您不使用这两个库,因此您只需使用您拥有的库提供的迭代功能.

如果您碰巧导入了两个库,我建议使用下划线函数

  • 它与数组上的标准ECMAScript函数最相似,因此您可以更轻松地迁移IE8将会死亡的那一天
  • 它更有效,因为它在可用时使用本机函数:

见来源:

...
if (nativeForEach && obj.forEach === nativeForEach) {
     obj.forEach(iterator, context);
...
Run Code Online (Sandbox Code Playgroud)

  • 下划线也接受普通对象而不是数组.http://jsfiddle.net/zdF6D/ jQuery的功能集是*less*complete,因为它不允许你通过第三个参数设置回调的`this`值. (2认同)