for...in

概要

指定された変数を、オブジェクトの全プロパティに対して任意の順序で反復します。異なるそれぞれのプロパティに対し、指定された文が実行されます。

実装されたバージョン JavaScript 1.0 、NES 2.0
ECMAScript エディション ECMA-262

構文

for (variable in object) {
  statement
}

引数

variable
任意で var キーワードを用いて宣言された、全プロパティに対して反復する変数。この変数はループにではなく、関数にローカルです。(言い換えれば、ループが完了したとき、変数は最後に訪問したプロパティの値を持ちます。)
object
プロパティが反復されるオブジェクト
statement
各プロパティに対して実行する文。ループ内で複数の文を実行するには、それらの文をグループ化するためにブロック文 ({ ... }) を使ってください。

説明

for...in ループは組み込みプロパティに対しては反復しません。これらには、StringindexOf メソッドや ObjecttoString メソッドといった、オブジェクトの全組み込みメソッドも含まれます。しかしながら、このループは (組み込みプロパティを上書きしたものも含む) すべてのユーザ定義プロパティに対して反復します。

for...in ループは、任意の順序でオブジェクトのプロパティに対して反復します。もしプロパティがある反復で修正された後に訪問されたなら、ループにより公開される値は後の時点での値となります。訪問される前に削除されたプロパティは、それから後には訪問されません。オブジェクトに対する反復が起きている中でそのオブジェクトに追加されたプロパティは、訪問されるかもしれませんし反復から省略されるかもしれません。一般的に、現在訪問しているプロパティ以外のものに関しては、反復の間はオブジェクトにプロパティを追加、修正、または削除しないのが一番です。追加したプロパティが訪問されるか、修正したプロパティが修正される前または後に訪問されるか、または削除したプロパティが削除される前に訪問されるかといったことには、何の保証もありません。

Array に対して反復する方法としてこれを使うのは魅力的かもしれませんが、そのことは悪い考えです。for...in 文は配列の要素に加えてユーザ定義プロパティに対しても反復するので、もし配列の非整数、または非正数のプロパティを (たとえば、"foo" プロパティを配列に追加することにより、または Array.prototype にメソッドかプロパティを追加することによってさえ) 修正していたなら、for...in 文は数値的な添え字に加えてユーザ定義プロパティの名前も返します。また、反復の順序は任意なので、配列に対しての反復は数値順に要素を訪問しないかもしれません。よって、配列に対して反復するときは、数値的な添え字を用いた伝統的な for ループを使うほうがよいのです。

例: for...in を使う

次の関数は、オブジェクトとそのオブジェクトの名前を引数として取ります。そして、そのオブジェクトの全プロパティに対して反復し、プロパティ名とその値を一覧にした文字列を返します。

function show_props(obj, objName) {
   var result = "";
   for (var i in obj) {
      result += objName + "." + i + " = " + obj[i] + "\n";
   }
   return result;
}

関連情報

  • for each...in - for...in に似ていますが、プロパティ名そのものではなく、オブジェクトのプロパティの値に対して反復します。(New in JavaScript 1.6。)
  • for

Document Tags and Contributors

タグ:
Contributors to this page: Potappo, Nanto vi, ethertank, Mgjbot
最終更新者: ethertank,