この翻訳は不完全です。英語から この記事を翻訳 してください。
for..inステートメントは、指定したオブジェクトのプロパティに対して、順不同で反復処理をします。指定された文が各プロパティに対して実行されます。
構文
for (variable in object) {... }
variable
variable
には、反復するごとに異なるプロパティ名が設定されます。object
- このオブジェクトのプロパティに対して反復処理がされます。
説明
for...in
ループは組み込みプロパティに対しては反復しません。これらには、String
の indexOf
メソッドや Object
の toString
メソッドといった、オブジェクトの全組み込みメソッドも含まれます。しかしながら、このループは (組み込みプロパティを上書きしたものも含む) すべてのユーザ定義プロパティに対して反復します。
A 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
ループは、任意の順序でオブジェクトのプロパティに対して反復します。もしプロパティがある反復で修正された後に訪問されたなら、ループにより公開される値は後の時点での値となります。訪問される前に削除されたプロパティは、それから後には訪問されません。オブジェクトに対する反復が起きている中でそのオブジェクトに追加されたプロパティは、訪問されるかもしれませんし反復から省略されるかもしれません。一般的に、現在訪問しているプロパティ以外のものに関しては、反復の間はオブジェクトにプロパティを追加、修正、または削除しないのが一番です。追加したプロパティが訪問されるか、修正したプロパティが修正される前または後に訪問されるか、または削除したプロパティが削除される前に訪問されるかといったことには、何の保証もありません。
A 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.
関連項目
for...of
- a similar statement that iterates over the property values- for each...in -
for...in
に似ていますが、プロパティ名そのものではなく、オブジェクトのプロパティの値に対して反復します。(廃止されました) for
- Generator expressions (uses the
for...in
syntax) - Enumerability and ownership of properties
Object.getOwnPropertyNames()
Object.prototype.hasOwnProperty()
Array.prototype.forEach()