for...in

オブジェクトの列挙可能なプロパティを、順不同で繰り返し処理します。 異なるそれぞれのプロパティに対して、処理文を実行する事が可能です。

文法

for (variable in object) {
  ...
}
引数 説明
variable

反復処理上で、各異なるプロパティ名に割り当てられている値です。

object

列挙可能なプロパティの反復処理を行うオブジェクトです。

説明

for...inによるループは、列挙不可のプロパティは反復処理しません。 ArrayObjectのような組み込みコンストラクタから作成したオブジェクトは、 StringindexOfメソッド、 またはObjecttoStringメソッドのような、 列挙不可のObject.prototypeString.prototypeから継承された列挙不可のプロパティを持ちます。

オブジェクト自身の列挙可能な全てのプロパティと、 自身のコンストラクタのprototype(上書きされたものを含む)から継承されたオブジェクトはループで反復処理されます。

for...inループでのオブジェクトのプロパティ処理の順番は不確定です。 何故、特定の順序で処理することが出来ないのかを詳しく知りたければ、 delete演算子の少なくとも「クロスブラウザ設定」のセクションを確認してください。

もし、1つの反復処理中にプロパティが変更されると、その後の処理では変更された値が参照されます。 プロパティが削除されると、その後の処理でそのプロパティが参照されることはありません。 反復処理中に追加されたプロパティは、参照されるかもしれないし、参照されないかもしれません。

一般的に、オブジェクトの反復処理中に現在参照しているプロパティの追加、変更、削除を行うべきではありません。 追加されたプロパティが参照されるのかされないのか、 変更されたプロパティが変更前、または後に参照されるのか、 削除されたプロパティが削除される前に参照するのか、などを保証することは出来ません。

もし、オブジェクト自身に割り当てられたプロパティでprototypeでは無いもののみを考慮したいのであれば、 getOwnPropertyNamesを使用するか、 hasOwnPropertyを実行して確認することが出来ます。 (propertyIsEnumerableも使用することが出来ます。) もし、あなたが外部のコードと干渉しない事を把握しているのであれば、 代わりの確認用のメソッドを組み込みプロパティへ拡張することも可能です。

for..inは、indexの順序が重要であるArrayの反復処理で使用すべきではありません。 Arrayのindexは、単なる列挙可能な数値名のプロパティにすぎず、 一般的なプロパティの全く同じです。 for...inが特定の順でindexを返す保証は無く、 また数値名では無く継承されたものを全て含む、列挙可能なプロパティを返すことになります。 何故なら反復処理の順序は実装依存であり、配列要素への処理は定められた順序で参照されないかもしれないからです。 そのため、参照する順序が重要となる配列の反復処理では、 数値indexを使用したforループ(または、Array.forEach、非標準のfor...ofループ)を使用するのが、 より良い方法と言えます。

下記の関数は引数として、オブジェクトとそのオブジェクトの名前を取得します。 その後、オブジェクトの列挙可能なプロパティを全て反復処理し、 そのプロパティ名と値を文字列で返します。

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

function show_props(obj, objName) {
  var result = "";

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

alert(show_props(o, "o")); /* alerts: o.a = 1 o.b = 2 o.c = 3 */

下記の関数はhasOwnPropertyを使用することで、 継承されたプロパティを表示しないようにしています。

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

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

ColoredTriangle.prototype = triangle;

function show_own_props(obj, objName) {
  var result = "";

  for (var prop in obj) {
    if( obj.hasOwnProperty( prop ) ) {
      result += objName + "." + prop + " = " + obj[prop] + "\n";
    }
  }

  return result;
}

o = new ColoredTriangle();
alert(show_own_props(o, "o")); /* alerts: o.color = red */

仕様

ブラウザ互換性

デスクトップ
機能 Chrome Firefox
(Gecko)
IE Opera Safari
基本
モバイル
機能 Android Chrome for
Android
Firefox
Mobile
IE
Mobile
Opera
Mobile
Safari
Mobile
基本

 Back to top

© 2017 Mozilla Contributors
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.

このページは、ページトップのURL先のMozilla Developer Network(以下、MDN)のコンテンツを翻訳した内容を基に構成されています。 構成について異なる点も含まれますので、下記の項目を確認し、必要に応じて元のコンテンツをご確認ください。 もし、誤訳などの間違いを見つけましたら、 @tomofまで教えていただければ幸いです。

  • 特定のブラウザに特化しすぎている情報やあまりにも古い情報、 または試験的に導入されているようなAPIや機能については、省略していることがあります。
  • 例やデモについて、実際にページ内で動作させる関係で一部ソースコードを変更している場合や、 その例で使用しているコンテンツの単語や文章などを日本人向けに変更しいてる場合があります。
  • MDNの更新頻度が高いため、元のコンテンツと比べ情報が古くなっている可能性があります。
  • "訳注:"などの断わりを入れた上で、日本人向けの情報の追記を行っている事があります。