定義と使い方
for...in文は、オブジェクトリテラル({})やnew Object()のように作成された通常のオブジェクト(Plain object)のプロパティ(キー)名を1つずつ繰り返し処理するためのループ構文です。 「オブジェクト」とは、JavaScriptにおける広範な概念であり、配列や関数、Map、Setなどもすべてオブジェクトに分類されます。 しかし、for...in文は通常、一般的なオブジェクト(Plain object)を走査する際に使用され、配列やイテラブルオブジェクトには適していません。
基本構文と動作原理
// JavaScript
for (variable in object) {
// 実行するコード
}
- variable:各プロパティ名(キー)を格納するための変数です。
- object:オブジェクトリテラル({})やnew Object()のように作成された一般的なオブジェクト(Plain object)です。
for...in文は、指定されたオブジェクトの列挙可能なプロパティを繰り返し処理し、各ループごとにvariableにプロパティ名が代入されます。これにより、該当するプロパティの値を取得することができます。
ループ中に変数へ代入される値
// JavaScript
const person = {
name: "John",
age: 30,
occupation: "Developer"
} // オブジェクトリテラルで定義されたオブジェクト
for (let key in person) {
console.log(key); // プロパティ名を出力
}
// コンソールに出力された結果
// name
// age
// occupation
オブジェクトのプロパティ値の取得
for...in文を使ってオブジェクトのプロパティを走査する際、変数に代入される値はプロパティ名であるため、これを利用してプロパティの値を取得する必要があります。そのためには、object[variable]という形式を使用します。
// JavaScript
const person = {
name: "John",
age: 30,
occupation: "Developer"
} // オブジェクトリテラルで定義されたオブジェクト
for (let key in person) {
console.log(key + ": " + person[key]); // プロパティ名と値を出力
}
// コンソールに出力された結果
// name: John
// age: 30
// occupation: Developer
これで、for...in文の基本的な使い方と動作の仕組み、ループ中の変数への代入およびプロパティ値の取得方法について理解できたと思います。次のセクションでは、for...in文の主な特徴について見ていきます。
for...in文の主な特徴
for...in文はオブジェクトのプロパティを走査する機能を提供しますが、いくつかの重要な特徴を考慮する必要があります。以下では、for...in文の主な特徴について詳しく見ていきます。
プロトタイプチェーンのプロパティも走査される
for...in文はオブジェクト自身のプロパティだけでなく、プロトタイプチェーン上のプロパティも走査します。これはオブジェクトの継承構造においてよく見られる特徴です。もしオブジェクト自身のプロパティのみを走査したい場合は、hasOwnPropertyメソッドを使って確認する必要があります。
列挙可能(enumerable)なプロパティのみを走査
for...in文はオブジェクトの列挙可能なプロパティのみを走査します。 オブジェクトのプロパティは基本的に列挙可能ですが、Object.defineProperty()メソッドを使ってプロパティのenumerable属性をfalseに設定すると、そのプロパティはfor...in文による走査対象から除外されます。
走査の順序は保証されない
for...in文を使ってオブジェクトのプロパティを走査する場合、プロパティの順序は保証されません。プロパティの順序が重要な場合は、他の方法を検討する必要があります。ES6以降は、順序が保証されるデータ構造であるMapやSetを使用する方がより安全です。配列(配列もオブジェクトです)の場合は、forEach()関数を使用してください。