Get to know MDN better
このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。
この機能は広く実装されており、多くのバージョンの端末やブラウザーで動作します。2015年7月以降、すべてのブラウザーで利用可能です。
for...of 文は、反復可能オブジェクトをソースとした一連の値を処理するループを実行します。反復可能オブジェクトには、 たとえば組み込みの Array, String, TypedArray, Map, Set, NodeList(およびその他の DOM コレクション)、同様に arguments オブジェクトや、ジェネレーター関数から生成されるジェネレーター、ユーザー定義の反復可能オブジェクトなどがあります。
反復処理の各回において、一連のデータから値を受け取ります。const, let, var, using, await using の何れかで定義されたものか、代入のターゲットとなります(以前に宣言した変数や、オブジェクトプロパティ、構造分解パターンなど)。var で宣言された変数はループのローカル変数にはなりません。すなわち for...of ループと同じスコープになります。
iterable反復可能オブジェクトです。ループを実行する一連の値の元となるものです。
statement反復処理のたびに実行される文です。variable を参照することができます。ブロック文を使用して、複数の文を実行することができます。
for...of ループは、反復可能オブジェクトから取り出した値を 1 つずつ順次処理します。ループが値に対して行う各処理は反復処理と呼ばれ、ループは反復可能オブジェクトを反復処理すると言います。それぞれの反復処理では、現在のシーケンス値を参照する可能性のある文が実行されます。
for...of ループが反復可能オブジェクトを反復処理する場合、最初にその反復可能オブジェクトの [Symbol.iterator]() メソッドが呼び出されます。これはイテレーターを返すので、その返されたイテレーターの next() メソッドを呼び出すことで、variable に代入される一連の値を生成することができます。
for...of ループは、イテレーターが完全に処理された時点で終了します(next() の結果は、done: true を持つオブジェクトです)。他のループ文と同様に、フロー制御文を statement 内部で使用することができます。
for...of ループが早期に終了した場合(例えば、break 文に遭遇したり、エラーが発生した場合)、return() のメソッドが呼び出されクリーンアップ処理が行われます。
for...of の variable 部分は、= 演算子の前に来ることができるものなら何でも受け入れることができます。const を使用して、ループ本体の中で再代入されない変数を宣言することができます(反復処理間では変更できます。2 つの別個の変数として扱われるからです)。そうでない場合は、let を使用してください。
メモ: 反復処理ごとに新しい変数が作成されます。ループ本体内で変数を再代入しても、反復可能オブジェクト(この場合は配列)の元の値には影響しません。
using または await using 宣言を使用して宣言された変数は、ループの反復が完了するたびに破棄されます(また、await using は反復の終了時に暗黙の await を発生させます)。ただし、ループが早期終了した場合、イテレーター内に残っている未訪問の値は破棄されません(現在の値は破棄されます)。
構造分解を使用して複数のローカル変数に代入することもできますし、 for (x.y of iterable) のようなプロパティアクセサーを使用して、オブジェクトプロパティに値を代入することもできます。
しかし、特別なルールにより、変数名として async を使用することは禁じられています。これは無効な構文です。
これは、for ループである有効なコード for (async of => {};) との構文のあいまいさを避けるためです。
同様に、using 宣言を使用する場合、変数に of と名付けることはできません。
これは、using が導入される前に有効だったコード for (using of []) との構文上の曖昧さを避けるためです。
文字列は Unicode コードポイント単位で反復処理します。
arguments オブジェクトで反復処理をすると、ある JavaScript 関数にすべての引数を渡すことができます。
次の例では read クラスを、<article> 要素の直接の子孫である段落に対して追加します。DOM の NodeList コレクションを反復処理すること実現します。
独自のイテレーターを返す [Symbol.iterator]() メソッドで、オブジェクトを反復処理します。
オブジェクトを [Symbol.iterator]() ジェネレーターメソッドで反復処理します。
反復可能なイテレーター(this を返す [Symbol.iterator]() メソッドを持つイテレーター)は、for...of などのイテレーターを想定した構文でイテレーターを使用可能にする、かなり一般的なテクニックです。
最初のループで break 文を実行すると、ループが早期に終了します。イテレーターはまだ完了していないので、2 つ目のループは最初のループが停止したところから継続されます。
ジェネレーターは return() メソッドを実装しており、ループが終了するとジェネレーター関数が早期復帰するように発生しています。このため、ジェネレーターはループをまたいで再利用することができません。
for...in および for...of 文は、両方とも何かに対する繰り返しです。これらの主な違いは、何に対する繰り返しなのかというところです。
for...in 文は、オブジェクトのすべての列挙可能なプロパティに対して、順序不定で繰り返し処理を行います。for...of 文は、反復可能なオブジェクトが定義した順序で値を反復処理します。
次の例では、Array に対して for...of ループと for...in ループを使用した場合の違いを示しています。
オブジェクト iterable は objCustom および arrCustom プロパティを継承しています。Object.prototype および Array.prototype の各プロパティを継承とプロトタイプチェーンで格納しているからです。
for...in ループは iterable オブジェクトの列挙可能なプロパティのみを出力します。配列の要素である 3, 5, 7 や "hello" は、列挙可能なプロパティではないため出力しません。これらは値です。配列の 添字 が arrCustom や objCustom と共に出力されます。なぜプロパティが反復処理に出てこないのかが分からない場合は、配列の反復処理と for...in にもっと詳しい説明があります。
2 番目のループは最初のものと似ていますが、Object.hasOwn() を使用して見つかった列挙可能なプロパティがオブジェクト自身のものであるか、すなわち継承したものでないかどうかをチェックしています。オブジェクト自身のプロパティである場合は、ログ出力します。0, 1, 2, foo は自身のプロパティであるため出力されます。arrCustom と objCustom は継承されたものであるために出力されません。
for...of ループは、iterable が反復可能オブジェクトとして定義している順序で 値 を反復処理し、ログ出力します。オブジェクトの 要素 である 3, 5, 7 は表示されますが、オブジェクトの プロパティ は表示されません。
| ECMAScript® 2027 Language Specification # sec-for-in-and-for-of-statements |
ブラウザー互換性一覧表を表示するには、JavaScript を有効にしてください。
より良いインターネットのための青写真。
このコンテンツの一部は、©1998–2026 個人の mozilla.org 協力者です。コンテンツはクリエイティブ・コモンズ・ライセンスのもとで利用できます。