Join MDN and developers like you at Mozilla's View Source conference, 12-14 September in Berlin, Germany. Learn more at https://viewsourceconf.org

この翻訳は不完全です。英語から この記事を翻訳 してください。

for..inステートメントは、指定したオブジェクトのプロパティに対して、順不同で反復処理をします。指定された文が各プロパティに対して実行されます。

構文

for (variable in object) {... }
variable
variable には、反復するごとに異なるプロパティ名が設定されます。
object
このオブジェクトのプロパティに対して反復処理がされます。

説明

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

for...in loop only iterates over enumerable properties. Objects created from built–in constructors like Array and Object have inherited non–enumerable properties from Object.prototype and String.prototype, such as String's indexOf() method or Object's toString() method. The loop will iterate over all enumerable properties of the object itself and those the object inherits from its constructor's prototype (properties closer to the object in the prototype chain override prototypes' properties).

プロパティの変更や削除

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

for...in loop iterates over the properties of an object in an arbitrary order (see the delete operator for more on why one cannot depend on the seeming orderliness of iteration, at least in a cross-browser setting). If a property is modified in one iteration and then visited at a later time, its value in the loop is its value at that later time. A property that is deleted before it has been visited will not be visited later. Properties added to the object over which iteration is occurring may either be visited or omitted from iteration. In general it is best not to add, modify or remove properties from the object during iteration, other than the property currently being visited. There is no guarantee whether or not an added property will be visited, whether a modified property (other than the current one) will be visited before or after it is modified, or whether a deleted property will be visited before it is deleted.

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

Array iteration and for...in

Note: for...in should not be used to iterate over an Array where the index order is important.

Array indexes are just enumerable properties with integer names and are otherwise identical to general Object properties. There is no guarantee that for...in will return the indexes in any particular order.  The for...in loop statement will return all enumerable properties, including those with non–integer names and those that are inherited.

Because the order of iteration is implementation-dependent, iterating over an array may not visit elements in a consistent order. Therefore it is better to use a for loop with a numeric index (or Array.prototype.forEach() or the for...of loop) when iterating over arrays where the order of access is important.

Iterating over own properties only

If you only want to consider properties attached to the object itself, and not its prototypes, use getOwnPropertyNames() or perform a hasOwnProperty() check (propertyIsEnumerable can also be used). Alternatively, if you know there won't be any outside code interference, you can extend built-in prototypes with a check method.

 

例: for...in を使う

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

var obj = {a:1, b:2, c:3};
    
for (var prop in obj) {
  console.log("obj." + prop + " = " + obj[prop]);
}

// Output:
// "obj.a = 1"
// "obj.b = 2"
// "obj.c = 3"

次の関数では hasOwnProperty(): の使い方を例示しています。継承されたプロパティは表示されません。

var triangle = {a:1, b:2, c:3};

function ColoredTriangle() {
  this.color = "red";
}

ColoredTriangle.prototype = triangle;

var obj = new ColoredTriangle();

for (var prop in obj) {
  if( obj.hasOwnProperty( prop ) ) {
    console.log("obj." + prop + " = " + obj[prop]);
  } 
}

// Output:
// "obj.color = red"

仕様

Specification Status Comment
ECMAScript 2017 Draft (ECMA-262)
for...in statement の定義
ドラフト  
ECMAScript 2015 (6th Edition, ECMA-262)
for...in statement の定義
標準  
ECMAScript 5.1 (ECMA-262)
for...in statement の定義
標準  
ECMAScript 3rd Edition (ECMA-262)
for...in statement の定義
標準  
ECMAScript 1st Edition (ECMA-262)
for...in statement の定義
標準 Initial definition.

ブラウザ互換性

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support (有) (有) 10 (有) (有)
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support (有) (有) (有) (有) (有) (有)

Compatibility: Initializer expressions

Prior to SpiderMonkey 40 (Firefox 40 / Thunderbird 40 / SeaMonkey 2.37), it was possible to use an initializer expression (i=0) in a for...in loop:

var obj = {a:1, b:2, c:3};
for(var i=0 in obj) {
  console.log(obj[i]);
}
// 1
// 2
// 3

This non-standard behavior is now ignored in version 40 and later and will present a SyntaxError ("for-in loop head declarations may not have initializers") warning in the console (バグ 748550 and バグ 1164741).

Other engines like v8 (Chrome), Chakra (IE/Edge), and JSC (WebKit/Safari) are investigating to remove the non-standard behavior as well.

関連項目

ドキュメントのタグと貢献者

タグ: 
 このページの貢献者: lv7777, mamodayo, teoli, taiyaki32, ethertank, Potappo, Mgjbot, Nanto vi
 最終更新者: lv7777,