web-dev-qa-db-ja.com

ECMAScript 5のオブジェクトにforEachメソッドがないのはなぜですか?

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

  • もっと簡潔です。
  • 反復するためだけに必要な変数は作成しません。
  • ループのローカル変数の可視性スコープを作成します。
  • パフォーマンスが向上します。

for(var key in object)を置き換えるobject.forEachがない理由はありますか?

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

37
Samuel Rossille

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

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

大きな理由は、組み込みプロパティをObjectに追加することを避けたいと思うからです。 Objectsは、Javascriptのすべての構成要素ですが、言語の一般的なキー/値ストアでもあります。 Objectに新しいプロパティを追加すると、Javascriptプログラムが使用する可能性のあるプロパティ名と競合します。そのため、Objectに組み込みの名前を追加する際には細心の注意を払っています。

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

これは、単に_obj.keys_の代わりにObject.keys(obj)がある理由でもあります。 Objectコンストラクターを汚染します。通常は大した問題ではないが、インスタンスはそのままにします。

76
Alex Wayne
  1. _.forEach_ does繰り返しのためだけに変数を作成します...作成したものではなく、自分で作成してください。
    shimを使用している場合、それらはクロージャー内のJS変数です。それ以外の場合は、C++など、またはブラウザーのネイティブ実装である可能性があります。

  2. ES6は、_for ... of_を取得しています。これは、渡されたものを繰り返し処理します。

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

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

ただし、ここでの問題は、ES5がES3の構文のほとんどを保持することを意図していたことです(新しいキーワードはほとんどなく、通常の使用では新しいキーワードはありません)。
追加機能のほとんどはメソッド呼び出しでなければなりませんでした(通常はプロトタイプ)。

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

6
Norguard

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

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

2
Varun Achar