【JS】for…in と for…of の違いと使い分け

技術

JavaScriptでループ処理(繰り返し構文)を書く際、for...infor...of のどちらを使うべきか曖昧になっていませんか?

今回は、違いをコード例付きで徹底解説します!

for…in:オブジェクトの「キー」をループする

for...in は、主にオブジェクトの「キー」を先頭から順に処理するために使用します。

for (const キー in オブジェクト) {
  // 処理
}

出力されるのは「バリュー」ではなく「キー」

ポイントは、ループの仮変数に格納されるのが「バリュー」ではなく「キー」である点です。

const todo = {
  name: '料理をする',
  description: 'カレーを料理する',
  date: 20260521
};

for (const key in todo) {
  console.log(key); 
}
// 出力されるのはキー
// "name"
// "description"
// "date"

もし「バリュー」を取得したい場合は、以下のようにオブジェクトにキーを流し込む必要があります。

for (const key in todo) {
  console.log(todo[key]); 
}
// 出力されるのはバリュー
// '料理をする'
// 'カレーを料理する'
// 20260521

for…of:配列の「バリュー」を直接ループする

for...of は、配列や列挙可能なオブジェクトの「バリュー」を直接取り出して処理するために使用します。

for (const 値 of 配列) {
  // 処理
}

値だけを安全に取得

バリューだけを出力してくれます。

const area = ['tokyo', 'osaka', 'nagoya'];

for (const item of area) {
  console.log(item);
}
// 出力されるのはバリュー
// "tokyo"
// "osaka"
// "nagoya"

⚠️ for…ofをオブジェクトで使用するとエラーが出ます。

for...of は、「順番に要素を取り出す仕組み(反復可能性 / Iterable)」を持っているデータにしか使えません。

const product = { 
  name: 'Nintendo Switch',
  price: 32978 
};

for (const value of product) {
  console.log(value);
}
// ❌ 実行結果 (エラー):
// TypeError: product is not iterable

【余談】オブジェクトのキーとバリューを取得する方法

オブジェクトのキーやバリューを配列として一括取得する方法と for...of を組み合わせる書き方が最も安全とされています。

const product = { 
  name: 'Nintendo Switch',
  price: 32978 
};

// Object.entries() で [キー, 値] の配列に変換し、for...of で回す
for (const [key, value] of Object.entries(product)) {
  console.log(`${key}: ${value}`);
}
// 出力されるのはキーとバリューの配列
// "name: Nintendo Switch"
// "price: 32978"

この方法を使えば、オブジェクトをループできます。

まとめ

最後に、2つの違いをわかりやすく表にまとめました。

特徴for…infor…of
主な用途オブジェクト配列
取得できるものキーバリュー

for...in
オブジェクトのキーを取得したい時

for...of
配列のバリューを取得したい時

正しく使い分けて、バグのない安全でクリーンなコードを書いていきましょう!

SNSでシェアする

SNSでシェアしていただけるととても嬉しいです。

Share