異なる反復対象と利用目的
基本概念の比較
| 区分 | for...in |
for...of |
|---|---|---|
| 反復対象 | プロパティ(key、インデックス)を反復処理できるオブジェクト | 値(value)を反復処理できるオブジェクト |
| ループ | オブジェクトから取得したプロパティ(key、インデックス)を基に動作 | オブジェクトから取得した値(value)を基に動作 |
| 使用可能なオブジェクト |
|
|
| 使用用途 | オブジェクトのプロパティ(key)を反復処理する際に使用 | オブジェクトの値(value)を反復処理する際に使用 |
| 使用目的 | データを操作する目的というよりも、主に一般的なオブジェクト(Plain objects)の特定の値(value)を持つプロパティ(key)を確認するデバッグ用 | オブジェクトの値(value)、つまりデータを操作するため |
- 一般的なオブジェクト(Plain objects)
- オブジェクトリテラル、
new Object()、コンストラクタ関数などで作成されたオブジェクトを指します。
中括弧({})の中には、0個以上のプロパティ名(property name, key)と値(value)をコロン(:)で結んだペアが入り、複数のペアはカンマ(,)で区切られた形式になっています。
例
for...in
for...in文は、主に反復処理によってデータを操作するというよりも、一般的なオブジェクト(Plain objects)の特定の値(value)を持つプロパティ(key)を確認するデバッグ用として使用されます。
const user = {
name: "太郎",
age: 30
};
for (let key in user) {
console.log(key, ":", user[key]);
}
/*
出力:
"name" : "太郎"
"age" : 30
*/
for...of
for...of文は、主にオブジェクトの値(value)、つまりデータを操作するために使用されます。例えば、DOMコレクションであるNodeListオブジェクトの要素を反復処理する際に活用できます。
<ul>
<li>うどん</li>
<li>ラーメン</li>
<li>おにぎり</li>
</ul>
const liElements = document.querySelectorAll("li"); // liセレクタをすべて選択
console.log(liElements); // NodeList(3) [li, li, li]
/* for...of文の適用 */
for (const liElement of liElements) {
console.log(liElement.textContent);
}
// 出力: "うどん" "ラーメン" "おにぎり"
コード補足説明querySelectorAll()で返されるNodeListオブジェクトは、擬似配列オブジェクトであり、かつfor...of文で反復処理可能なオブジェクトです。
考慮すべき点
仕様書
| 仕様書 | |
|---|---|
for...in, for...of
|
ECMAScript Language Specification #sec-for-in-and-for-of-statements |
互換性
| 文 |
デスクトップ Chrome
|
デスクトップデスクトップ Edge
|
デスクトップ Firefox
|
Safari
|
Node.js
|
|---|---|---|---|---|---|
for...in
|
1 | 12 | 1 | 1 | 0.10 |
for...of
|
38 | 12 | 13 | 7 | 0.12 |