MDN wants to learn about developers like you:

この翻訳は不完全です。英語から この記事を翻訳 してください。 文は、指定したオブジェクトの列挙可能プロパティに対して、順不同で反復処理をします。各プロパティに対して、指定された文を実行できます。


for (variable in object) {... }
反復するごとに、variable に異なるプロパティ名が代入されます。

説明 ループは列挙可能プロパティに対してのみ反復されます。ArrayObject のようなビルトインのコンストラクタから生成したオブジェクトは、StringindexOf メソッドや ObjecttoString メソッドといった、Objet.prototypeString.prototype から列挙可能でないプロパティを継承しています。このループは、対象オブジェクト自身とそのオブジェクトがプロトタイプから継承しているすべての列挙可能なプロパティを反復します (プロトタイプチェーンで対象オブジェクトに近いプロパティは、親プロトタイプのプロパティを上書きする)。

プロパティの変更や削除 ループは、任意の順序でオブジェクトのプロパティに対して反復します。もしプロパティがある反復で修正された後に訪問されたなら、ループにより公開される値は後の時点での値となります。訪問される前に削除されたプロパティは、それから後には訪問されません。オブジェクトに対する反復が起きている中でそのオブジェクトに追加されたプロパティは、訪問されるかもしれませんし反復から省略されるかもしれません。一般的に、現在訪問しているプロパティ以外のものに関しては、反復の間はオブジェクトにプロパティを追加、修正、または削除しないのが一番です。追加したプロパティが訪問されるか、修正したプロパティが修正される前または後に訪問されるか、または削除したプロパティが削除される前に訪問されるかといったことには、何の保証もありません。 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 に対して反復する方法としてこれを使うのは魅力的かもしれませんが、そのことは悪い考えです。 文は配列の要素に加えてユーザ定義プロパティに対しても反復するので、もし配列の非整数、または非正数のプロパティを (たとえば、"foo" プロパティを配列に追加することにより、または Array.prototype にメソッドかプロパティを追加することによってさえ) 修正していたなら、 文は数値的な添え字に加えてユーザ定義プロパティの名前も返します。また、反復の順序は任意なので、配列に対しての反復は数値順に要素を訪問しないかもしれません。よって、配列に対して反復するときは、数値的な添え字を用いた伝統的な for ループを使うほうがよいのです。

Array iteration and

Note: 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 will return the indexes in any particular order.  The 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.


例: を使う


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) statement の定義
ECMAScript 2015 (6th Edition, ECMA-262) statement の定義
ECMAScript 5.1 (ECMA-262) statement の定義
ECMAScript 3rd Edition (ECMA-262) statement の定義
ECMAScript 1st Edition (ECMA-262) 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 loop:

var obj = {a:1, b:2, c:3};
for(var i=0 in obj) {
// 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.



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