分别来自_.forEach
和$.each
的这两个函数underscore
和jQuery
似乎也是一样的。
将一种实施方案倾向于另一种实施方案的可能原因是什么?
答案 0 :(得分:16)
_.forEach
和$.each
不同。
如果使用_.forEach
,传递给回调的第一个参数是值,而不是键
因此,如果您根本不关心密钥,则应使用_.forEach
。
其他差异:
_.forEach
它在现代浏览器中使用原生Arrray.prototype.forEach
会更快一些。答案 1 :(得分:6)
jQuery 看起来像:
something.each( function(index, Element) )
下划线看起来像:
_.each(list, function(Element, index, list), [context])
// or
_(list).each(function(Element, index, list), [context])
原生array.forEach 如下所示:
array.forEach(function(Element, index, list), [context])
所以:
forEach
this
设置为Element
,本机和Underscore允许您提供自己的上下文编辑:为什么能够设置上下文是有用的?
考虑一下你有某种对象:
var worker = new FooWorker();
worker.process(something);
worker.process(somethingElse);
假设您要对数组中的每个值调用该方法 使用context参数,您可以简单地说:
myArray.forEach(worker.process, worker);
虽然没有它,你需要更详细(并为每个元素再做一次函数调用):
// native
myArray.forEach( function(i, e) {worker.process(e);} );
// jquery
$(myArray).each( function() {worker.process(this); } );
这是JQuery的预告约定使事情变得不那么方便的一种情况。
答案 2 :(得分:5)
它们都主要提供IE8中不可用的forEach功能的替代。
如果你在数组上进行迭代,它们就不会增加太多。
除了回调参数的顺序之外,主要区别在于jQuery中的值也可用作回调调用的上下文(这就是为什么值,不太重要,只是提供的第二个参数)。除非你真的想避免将参数传递给函数,否则这并不是偏好它的主要原因:
var product = 1;
$.each([1, 2, 3], function(){ product *= this });
大多数情况下,您不使用这两个库,因此您只需使用您拥有的库提供的迭代功能。
如果您碰巧导入了两个库,我建议使用下划线函数
...
if (nativeForEach && obj.forEach === nativeForEach) {
obj.forEach(iterator, context);
...