これらの2つの関数、 _.forEach
および$.each
は、それぞれから取得され、同じものを作成しているようですunderscore
。jQuery
ある実装を他の実装よりも優先する理由として考えられるものは何ですか?
これらの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])
ネイティブarray.forEachは次のようになります。
array.forEach(function(Element, index, list), [context])
それで:
forEach
this
をElement
ネイティブおよびアンダースコアに設定すると、独自のコンテキストを提供できます編集:コンテキストを設定できると便利なのはなぜですか?
ある種のオブジェクトがあると考えてください。
var worker = new FooWorker();
worker.process(something);
worker.process(somethingElse);
配列のすべての値でそのメソッドを呼び出したいとします。
コンテキストパラメータを使用すると、次のように簡単に言うことができます。
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);
...