1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JavaScript for…in:プロパティ(key)で順回できるオブジェクト用ループ

1
Posted at

定義と使い方

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()関数を使用してください。

参考資料

codingEverybody:JavaScript for…in:プロパティ(key)で順回できるオブジェクト用ループ
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?