これらの2つの関数、_.forEach
および$.each
、それぞれunderscore
とjQuery
から取得したものは同じことをしているようです。
ある実装を他の実装よりも好む理由として考えられるものは何ですか?
_.forEach
と$.each
は、コールバックに渡される引数が異なります。
_.forEach
を使用する場合、コールバックに渡される最初の引数は値であり、キーではありません。
したがって、キーについてまったく気にしない場合は、_.forEach
を使用する必要があります。
その他の違い:
_.forEach
最近のブラウザでは、ネイティブのArrray.prototype.forEach
を使用しているため、少し高速になります。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
と同じ引数の順序を維持しますthis
をElement
に設定し、ネイティブおよびアンダースコアを使用すると、独自のコンテキストを提供できます編集:コンテキストを設定できると便利なのはなぜですか?
ある種のオブジェクトがあると考えてください。
var worker = new FooWorker();
worker.process(something);
worker.process(somethingElse);
配列のすべての値でそのメソッドを呼び出したいとします。
contextパラメータを使用すると、次のように簡単に言うことができます。
myArray.forEach(worker.process, worker);
それがないと、より冗長になる必要があります(そして、要素ごとにもう1つの関数呼び出しを実行します)。
// native
myArray.forEach( function(i, e) {worker.process(e);} );
// jquery
$(myArray).each( function() {worker.process(this); } );
これは、JQueryのforeaching規則によって物事が不便になる状況の1つです。
どちらも主に、IE8では使用できない forEach 関数の代わりになります。
配列を反復処理している場合、それらはあまり追加されません。
主な違いは、コールバック引数の順序は別として、jQueryでは値がコールバックの呼び出しのコンテキストとしても使用できることです(これが、重要性の低い値が2番目の引数のみである理由です)。関数に引数を渡さないようにしたい場合を除いて、これは実際にはそれを好む主な理由ではありません。
var product = 1;
$.each([1, 2, 3], function(){ product *= this });
ほとんどの場合、両方のライブラリを使用することはないため、使用しているライブラリが提供する反復関数を使用するだけです。
両方のライブラリをインポートする場合は、アンダースコア関数を次のように使用することをお勧めします。
ソースを参照 :
...
if (nativeForEach && obj.forEach === nativeForEach) {
obj.forEach(iterator, context);
...