for...of
文
for...of
文は、反復可能(iterable)なオブジェクトを巡回するためのループ構文です。
JavaScript においては、Iterable Protocol(イテラブルプロトコル)に準拠したオブジェクトがイテラブルオブジェクトと見なされます。
for...of
文を使って反復可能なイテラブルオブジェクトの概念と、for...of
文の使い方、および注意点について解説します。
for...of
文とイテラブルオブジェクトの概要
for...of
文は、ECMAScript 2015(ES6)から導入されたJavaScriptのループ構文の一つです。
この構文は、DOMコレクションオブジェクトの各要素に対して繰り返し処理を行うのに非常に便利な方法を提供します。
DOMコレクションオブジェクトであるHTMLCollectionとNodeListは、いずれも配列のようなオブジェクト(類似配列オブジェクト)であり、かつイテラブルオブジェクトでもあります。
このとき、「イテラブルオブジェクト」という概念が重要な役割を果たします。
イテラブルオブジェクトとは何か?
for...of
文は、イテラブルオブジェクトの反復処理のために設計されたものです。for...of
文を理解し使用するためには、何よりもまずイテラブルオブジェクトの概念を理解しておく必要があります。
イテラブルプロトコル(Iterable Protocol)
そこで、JavaScriptは反復可能なオブジェクトに対して統一された規約を作りました。この規約が「イテラブルプロトコル」です。イテラブルプロトコルとは、JavaScriptにおいてイテラブルオブジェクトを定義し、利用するためのルールを指します。イテラブルオブジェクトとは、このイテラブルプロトコルを遵守したオブジェクトのことです。
イテラブル(iterable)オブジェクトとは、オブジェクト内部に特別なメソッドであるSymbol.iterator
が定義されており、そのメソッドがイテレーター(iterator)を返すオブジェクトのことを指します。
イテラブルオブジェクトとは、反復可能なデータコレクションのことであり、JavaScriptにおいてイテラブルオブジェクトを定義し利用するための規約(プロトコル)に従って動作します。
イテラブルプロトコルは、Symbol.iterator
メソッドとイテレーター(iterator
)オブジェクト、この二つの主要な要素で構成されています。これがfor...of
文を使用できる基盤となっています。
複雑に考えがちですが、内部構造や仕組みについてはここでは一旦置いておきます。しかし、重要なポイントがあります。
イテラブルオブジェクトはfor...of
文で統一的に反復処理が可能です。この点が重要です。
イテラブルオブジェクトの種類
- 配列:配列の各要素を順に処理して操作することができます。
- 文字列:文字列の各文字にアクセスして操作できます。
- DOMコレクションオブジェクトであるHTMLCollectionおよびNodeList
Map
とSet
:キーと値のペアを持つMap
や、ユニークな値のみを持つSet
を反復処理できます。
注意してください!
オブジェクトリテラルやクラスはイテラブルオブジェクトではありません。
for...of
文を使用すると、イテラブルオブジェクトを反復処理して各要素にアクセスし、データを操作することができます。
for...of
文の使い方
for...of
文は、JavaScriptにおいてイテラブルオブジェクトを反復処理するためのループ構文です。
基本文法と動作原理
for...of
文の基本文法は次の通りです。
for (variable of iterable) {
// 繰り返し実行するコード
}
variable
:ループ内で現在反復処理中の要素を格納する変数名を指定します。この変数はループの各反復で更新され、各要素に対する操作に使用されます。iterable
:反復処理したいイテラブルオブジェクトです。配列、文字列、Map
、Set
、NodeList
など、さまざまなオブジェクトを反復処理できます。
例を通して理解を深めましょう。
const iterable = [1, 2, 3, 4, 5]; // 配列を例として使用
for (const item of iterable) {
console.log(item);
}
2
3
4
5
上記のコードでは、item
が各反復ごとに配列iterable
の要素に更新され、console.log(item)
のコードが実行されます。その結果、配列の各要素が出力されます。
さらに詳しく見ていきましょう。
const iterable = "Hello"; // 文字列を例として使用
for (const char of iterable) {
console.log(char);
}
e
l
l
o
今回は文字列をイテラブルとして使用し、文字列の各文字にアクセスして出力します。
DOMコレクションであるNodeList
やHTMLCollection
もイテラブルとして使用でき、同様の方法で要素にアクセスすることが可能です。
<div></div>
<div></div>
<div></div>
<div></div>
const elements = document.querySelectorAll("div"); // NodeList
for (const element of elements) {
console.log(element);
}
<div></div>
<div></div>
<div></div>
このように、for...of
文はさまざまなイテラブルオブジェクトを反復処理し、各要素にアクセスして操作を行うために使用されます。for...of
文は内部的にイテレータープロトコルを利用して反復処理を行うため、ユーザー定義のイテラブルオブジェクトにも適用可能です。
for...of
文を使用する際の注意点
- 配列のインデックス情報の欠落
- オブジェクトリテラルには使用できません:イテラブルオブジェクトではありません
配列のインデックス情報の欠落
for...of
文は、配列の要素にアクセスするための反復変数のみを提供します。
const myArray = [10, 20, 30, 40, 50];
// "for...of"文で配列を反復処理(インデックス情報は含まれません)
for (const item of myArray) {
console.log(item); // 配列の要素を出力
}
// "for...in"文で配列を反復処理(インデックス情報を含みます)
for (const index in myArray) {
console.log(index, myArray[index]); // インデックスと配列の要素を出力
}
// "forEach"関数で配列を反復処理(インデックス情報は含まれません)
myArray.forEach((item) => {
console.log(item); // 配列の要素を出力
});
オブジェクトリテラルには使用できません:イテラブルオブジェクトではありません
オブジェクトリテラルはイテラブルオブジェクトではありません!
for...of
文はオブジェクトリテラルの反復処理には使用できません。オブジェクトリテラルはイテラブルオブジェクトではないためです。オブジェクトのプロパティを反復処理する場合は、for...in
文のほうが適しています。
const myObject = {
a: 1,
b: 2,
c: 3
}
for (const prop of myObject) { // ここでエラーが発生します
console.log(prop);
}
// TypeError: myObject is not iterable
正しい方法は、for...in
文や、Object.keys()
、Object.values()
、Object.entries()
メソッドを使用することです。
for (const prop in myObject) {
console.log(myObject[prop]);
}
for (const [key, value] of Object.entries(myObject)) {
console.log(key, value);
}
仕様書
仕様書 | |
---|---|
for...of
|
ECMAScript Language Specification #sec-for-in-and-for-of-statements |
ブラウザ互換性
文 |
デスクトップ Chrome
|
デスクトップデスクトップ Edge
|
デスクトップ Firefox
|
Safari
|
---|---|---|---|---|
for...of
|
38 | 12 | 13 | 7 |