配列に対するfor…inの注意点 | for…in | JavaScript 超完全入門 基本から発展までのすべて

現在作成中です。今後加筆修正してまいります。
スポンサーリンク
スポンサーリンク

for…inとは?

for…inは、オブジェクトのプロパティを繰り返し処理するための構文です。しかし、配列に対してfor...inを使用すると、予期せぬ結果が生じることがあります。これは、配列のインデックスだけでなく、その他のプロパティもループの対象となるためです。

配列に対するfor…inの基本例

次に、配列に対してfor...inを使う基本的な例を見てみましょう。

const fruits = ["apple", "banana", "orange"];

for (let index in fruits) {
    console.log(index + ": " + fruits[index]);
}

この例では、配列fruitsの各インデックスがfor...inで列挙され、対応する要素が出力されます。結果として、以下のような出力が得られます。

  • 0: apple
  • 1: banana
  • 2: orange

一見問題ないように見えますが、配列に追加のプロパティを設定すると、意図しない結果を招くことがあります。

配列に追加プロパティを設定した場合の注意点

JavaScriptの配列はオブジェクトとして扱われるため、インデックス以外にもプロパティを追加することが可能です。しかし、これがfor...inで列挙される原因となり、配列の要素以外のプロパティがループの対象に含まれる可能性があります。

const fruits = ["apple", "banana", "orange"];
fruits.color = "red";  // プロパティを追加

for (let index in fruits) {
    console.log(index + ": " + fruits[index]);
}

この例では、fruits配列に新たなプロパティcolorを追加しました。for...inループを実行すると、このcolorプロパティも含まれるため、次のように予期しない出力が表示されます。

  • 0: apple
  • 1: banana
  • 2: orange
  • color: red

このように、配列に対してfor...inを使うと、オブジェクトとしてのプロパティまで列挙されてしまい、意図しない動作を引き起こす可能性があります。

配列を繰り返すための適切な方法

配列を繰り返し処理する場合、for...inの代わりにforfor...ofを使うことが推奨されます。これにより、配列のインデックスや要素だけを安全に処理することができます。

forループの例

const fruits = ["apple", "banana", "orange"];

for (let i = 0; i < fruits.length; i++) {
    console.log(i + ": " + fruits[i]);
}

このforループでは、配列のインデックスを直接制御するため、余分なプロパティが含まれることはありません。

for...ofループの例

const fruits = ["apple", "banana", "orange"];

for (let fruit of fruits) {
    console.log(fruit);
}

このfor...ofループでは、配列の要素だけを直接取得でき、インデックスや余分なプロパティに関する問題が回避されます。

まとめ

JavaScriptのfor...inは、オブジェクトのプロパティを列挙するために便利な構文ですが、配列に対して使用する際には注意が必要です。配列に余分なプロパティが含まれる場合、それらもループの対象になり、意図しない動作が発生することがあります。配列を安全に繰り返すためには、forfor...ofを使用することが推奨されます。