web-dev-qa-db-ja.com

`_.forEach`と` $ .each`の違い

これらの2つの関数、_.forEachおよび$.each、それぞれunderscorejQueryから取得したものは同じことをしているようです。

ある実装を他の実装よりも好む理由として考えられるものは何ですか?

17

_.forEach$.eachは、コールバックに渡される引数が異なります。

_.forEachを使用する場合、コールバックに渡される最初の引数は値であり、キーではありません。
したがって、キーについてまったく気にしない場合は、_.forEachを使用する必要があります。

その他の違い:

  1. _.forEach最近のブラウザでは、ネイティブのArrray.prototype.forEachを使用しているため、少し高速になります。
  2. この値も異なります。 jQueryの動作は標準に準拠していませんが、アンダースコアは準拠しています。
16
antonjs

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の実装には2つの違いがあります:
    • JQueryはthisElementに設定し、ネイティブおよびアンダースコアを使用すると、独自のコンテキストを提供できます
    • ネイティブとアンダースコアは、コールバックの3番目の引数としてリスト自体も提供します。

編集:コンテキストを設定できると便利なのはなぜですか?

ある種のオブジェクトがあると考えてください。

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つです。

6
Kos

どちらも主に、IE8では使用できない forEach 関数の代わりになります。

配列を反復処理している場合、それらはあまり追加されません。

主な違いは、コールバック引数の順序は別として、jQueryでは値がコールバックの呼び出しのコンテキストとしても使用できることです(これが、重要性の低い値が2番目の引数のみである理由です)。関数に引数を渡さないようにしたい場合を除いて、これは実際にはそれを好む主な理由ではありません。

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

ほとんどの場合、両方のライブラリを使用することはないため、使用しているライブラリが提供する反復関数を使用するだけです。

両方のライブラリをインポートする場合は、アンダースコア関数を次のように使用することをお勧めします。

  • これは、配列の標準ECMAScript関数に最も類似しているため、IE8が停止する日をより簡単に移行できます。
  • 利用可能な場合はネイティブ関数を使用するため、より効率的です。

ソースを参照

...
if (nativeForEach && obj.forEach === nativeForEach) {
     obj.forEach(iterator, context);
...
5
Denys Séguret