40

ECMAScript 5array.forEach(callback[, thisArg])は、配列を反復処理するのに非常に便利であり、次の構文よりも多くの利点があります。

  • もっと簡潔です。
  • 反復の目的でのみ必要な変数は作成されません。
  • ループのローカル変数の可視性スコープを作成します。
  • パフォーマンスが向上します。

object.forEach交換がない理由はありfor(var key in object)ますか?

もちろん、_。eachや$ .eachなどのJavaScript実装を使用することもできますが、これらはパフォーマンスを低下させます。

4

3 に答える 3

81

まあ、それはあなた自身を装備するのはかなり簡単です。なぜプロトタイプをさらに汚染するのですか?

Object.keys(obj).forEach(function(key) {
  var value = obj[key];
});

大きな理由は、ビルトインプロパティをに追加することを避けたいと思う力があることだと思いますObjectObjectsは、Javascriptのすべての構成要素ですが、言語の汎用キー/値ストアでもあります。に新しいプロパティを追加するObjectと、Javascriptプログラムが使用する可能性のあるプロパティ名と競合します。したがって、組み込みの名前をに追加する場合Objectは、細心の注意を払って行ってください。

配列は整数でインデックス付けされるため、この問題は発生しません。

これはObject.keys(obj)、単にの代わりに私たちが持っている理由でもありますobj.keys。通常は大したことではないのでコンストラクターを汚染しObjectますが、インスタンスはそのままにしておきます。

于 2013-02-18T05:18:59.510 に答える
6
  1. .forEach 反復の目的でのみ変数を作成します...自分で作成した変数ではありません
    シムを使用している場合、それらはクロージャー内のJS変数です。そうでない場合は、C ++、またはブラウザーのネイティブ実装が何であれ、それらが使用されている可能性があります。

  2. ES6は、for ... of通過したものをすべて反復処理するようになっています。

  3. letES6は、の代わりにを使用して、(関数スコープではなく)ブロックレベルの変数も取得していますvar

  4. ES6の特定の種類のオブジェクト(つまり、イテレーターをサポートするために作成したオブジェクト)にイテレーターを追加できるようになります。

ただし、ここでの問題は、ES5がES3の構文のほとんどを保持することを目的としていたことです(新しいキーワードはほとんどなく、通常使用される新しいキーワードはありません)。
追加機能のほとんどは、メソッド呼び出しである必要がありました(通常はプロトタイプ)。
また、ES3のリリース以降、JSの使用がどれだけ増えたかを考えると、アレイには多くの作業が必要でした。

非常に特殊なオブジェクトを構築している場合を除いて、オブジェクトには.map()/能力は必要ありません。その場合、オブジェクトを自分で実装します。.reduce()

于 2013-02-18T05:28:14.640 に答える
2

javascriptのすべてのオブジェクトはから継承することを覚えておく必要がありますObject。javascriptのすべてのオブジェクトで、プロパティを繰り返す必要はありません。それらは主にデータモデルオブジェクトに限定されています。forEachメソッドを追加すると、すべてのオブジェクトのプロトタイプが不必要に大きくなるだけです。

現在オブジェクトとそのメソッドが表示されている場合、それらはオブジェクトを識別するため、またはあるオブジェクトを別のオブジェクトと区別するためにのみ存在します。

于 2013-02-18T05:21:27.603 に答える