Amazon 数量限定タイムセール開催中

【ES6】JavaScript:for…of文とは?使えないときの対処法

【ES6】JavaScript:for…of文とは?使えないときの対処法

このページでは、JavaScriptの「for…of文」について分かりやすく解説しています。

基本的な使い方や応用方法など、実際にコードの例を交えて解説していますので参考にしてみてください。

ノーノちゃん

for…of文はどういうことができるの?
かんたんに言うと、たくさんのデータが入っているものから、1つずつ順番に取り出して使うことができる道具みたいなものです。

ぶたさん

1. JavaScriptのfor…of文とは?

JavaScriptのfor…of文とは?

まずはじめにJavaScriptのfor…of文について解説します。

基本的な情報やfor…of文が使用できるデータなどについて、くわしく書いていますのでチェックしてみてください。

基本情報

構文名 for...of文
登場時期 ES6(2015年)
使える対象 ・配列
・文字列
・Map
・Set
・arguments
使えない対象 ・数値
・オブジェクト
制御構文の使用 break:◯
continue:◯
return:◯
主な役割 配列や文字列などの値をひとつずつ順番に取り出して処理する
基本文法 for (const 変数名 of 配列名)

主な役割

「for…of文」は、配列や文字列などの並べられたデータを、ひとつずつ順番どおりに取り出して処理することができる構文です。

たとえば、下記のように果物の名前が入った配列があった場合に、それを1つずつ取り出して画面に表示するということができます。

js
コピー 拡大
const fruits = ["りんご", "みかん", "バナナ"];

for (const fruit of fruits) {
  console.log(fruit);
}
コンソール(実行結果)
コピー 拡大
りんご
みかん
バナナ

このようにfor…of文は並べられたデータをひとつずつ処理することができます。

JavaScriptではとてもよく使われる構文なので、しっかり覚えておきましょう。

ノーノちゃん

for…of文はどんなデータにも使えるの?
for…of文は「イテレータを持ったデータ」に対してのみ使えます。くわしくは次の項目で解説しますね。

ぶたさん

使える対象データ

for…of文は「iterator(イテレータ)を持ったデータ」に対して使用できます。

イテレータをとは、かんたんに言うとデータの中身を1つずつ順番に取り出せる機能のことです。

つまり、その順番に取り出す機能(イテレータ)を持ったデータであれば、for…of文を使って中身を1つずつ取り出すことができます。

それでは次にfor…of文が「使えるデータ」と「使えないデータ」を見ていきましょう。

ぶたさん

for…of文が使えるデータ

for…of文が使えるデータ
こちらはfor…of文が使える「イテレータを持ったデータ」になります。
データの種類 意味
配列
(Array)
順番に並んだデータのリスト ["あ","い","う"]
文字列
(String)
文字が並んだもの "あいう"
Map
(オブジェクト)
キーと値を入れられるフォルダ (順番が決まっている) new Map([["キー1", 値1],["キー2", 値2]]);
Set
(オブジェクト)
値だけを集めたデータ new Set(["値", "値", "う"])
TypedArray
(オブジェクト)
特定の型で作られた配列 new Uint8Array([1, 2, 3])
arguments
(オブジェクト)
関数に渡された引数の一覧 function showArgs(...args) {}showArgs("A", "B", "C");
DOM
(コレクション)
HTML要素の一覧など document.querySelectorAll("p")

 

for…of文が使えないデータ

for…of文が使えないデータ
こちらはfor…of文が使えない「イテレータを持っていないデータ」になります。
データの種類 意味
数値 単なる数字
(計算できる数字)
123
オブジェクト キーと値を入れられるフォルダ
(順番が決まっていない)
{キー1:値1,キー2:値2}

2. for…of文の書き方(基礎)

for…of文の書き方(基礎)

ここでは、for…of文の基本的な書き方をご紹介します。

配列や文字列などのデータから、要素や値を1つずつ順番に取り出すための方法を分かりやすく解説していますので参考にしてみてください。

基本的な文法

js
コピー 拡大
for (const 変数名 of 対象データ名) {
  //処理内容
}
部分 意味
for 「繰り返し処理をしますよ」という宣言
const 「変更できない変数(箱)を作る」という宣言
変数名 配列や文字列などから取り出された値がここに入る(好きな名前でOK)
of 「?の中身を1つずつ取り出す」という意味
対象データ名 処理をしたいデータの名前(変数名、配列名など)
処理内容 取り出した値に対して実行する処理を書く

配列を処理

for…of文で配列を処理
for…of文で配列の値を1つずつ順番に取り出す方法です。

コードの書き方

js
コピー 拡大
const 配列名 = ["値1", "値2", "値3"];

for (const 変数名 of 配列名) {
  //処理内容
}

コードの例と解説

js
コピー 拡大
const animals = ["猫", "犬", "うさぎ"];

for (const animalhouse of animals) {
  console.log(animalhouse);
}
コンソール(実行結果)
コピー 拡大
猫
犬
うさぎ
  1. const animals = ["猫", "犬", "うさぎ"];
    「animals」という名前の変数を作り、配列[]の中に「猫」「犬」「うさぎ」という要素を入れる。
  2. for (const animalhouse of animals)
    変数「animals」の中から1つずつ要素を取り出して、「animalhouse」という変数に入れる繰り返しを始める。
  3. console.log(animalhouse);
    変数「animalhouse」の中身をコンソール画面に表示する。

【配列のコード】

js
コピー 拡大
const animals = ["猫", "犬", "うさぎ"];
コード 種別 意味
const 変数宣言
キーワード
変更できない変数(箱)を作る宣言
animals 配列名 リストの名前
= 代入演算子 右のものを左に入れる
[] 配列 リスト
"猫"
"犬"
"うさぎ"
要素 リストの中身
"" 囲い記号 囲まれたものを文字列として扱う
, カンマ演算子 左から順に実行して結果を返す
; 区切り記号 文末につける記号

 
【for…of文のコード】

js
コピー 拡大
for (const animalhouse of animals) {
  console.log(animalhouse);
}
コード 種別 意味
for 制御構文 指定した回数だけ処理をくり返す命令
() カッコ for文の制御部分
const 変数宣言
キーワード
変更できない変数(箱)を作る宣言
animalhouse 変数名 変数(箱)の名前
of 演算子 〜の中身を1つずつ取り出す
animals 配列名 リストの名前
{} ブロック
スコープ
{}内にくり返したい処理を書く
console.log() 出力命令 ()の中身をコンソールに表示

文字列を処理

for…of文で文字列を処理
for…of文で文字列からを1つずつ順番に取り出す方法です。

コードの書き方

js
コピー 拡大
const 変数名1 = "文字列";

for (const 変数名2 of 変数名1) {
  //処理内容
}

コードの例と解説

js
コピー 拡大
const text = "こんにちは";

for (const a of text) {
  console.log(a);
}
コンソール(実行結果)
コピー 拡大
こ
ん
に
ち
は
  1. const text = "こんにちは";
    「text」という名前の変数を作り、その中に「こんにちは」という文字列を入れる。
  2. for (const a of text)
    変数「text」の中から1つずつ値を取り出して、「a」という変数に入れる繰り返しを始める。
  3. console.log(animalhouse);
    変数「a」の中身をコンソール画面に表示する。
 
【文字列のコード】
js
コピー 拡大
const text = "こんにちは";
コード 種別 意味
const 変数宣言
キーワード
変更できない変数(箱)を作る宣言
text 変数名 変数(箱)の名前
= 代入演算子 右のものを左に入れる
"こんにちは" 文字列 文字が並んだもの
"" 囲い記号 囲まれたものを文字列として扱う
; 区切り記号 文末につける記号

【for…of文のコード】

js
コピー 拡大
for (const a of text) {
  console.log(a);
}
コード 種別 意味
for 制御構文 指定した回数だけ処理をくり返す命令
() カッコ for文の制御部分
const 変数宣言
キーワード
変更できない変数(箱)を作る宣言
a 変数名 変数(箱)の名前
of 演算子 〜の中身を1つずつ取り出す
text 配列名 リストの名前
{} ブロック
スコープ
{}内にくり返したい処理を書く
console.log() 出力命令 ()の中身をコンソールに表示

3. for…of文の書き方(応用)

for…of文の書き方(応用)

continueで特定の値をスキップ

for…of文で特定の値をスキップ(continue)
continue(コンティニュー)を使って特定の要素や値のみをスキップする方法です。
js
コピー 拡大
const fruits = ["りんご", "スイカ", "もも", "みかん"];

for (const basket of fruits) {
  if (basket === "スイカ") continue;  // スイカはスキップ
  console.log(basket);
}
コンソール(実行結果)
コピー 拡大
りんご
もも
みかん
  1. const fruits = ["りんご", "スイカ", "もも", "みかん"];
    「animals」という名前の変数を作り、配列[]の中に「りんご」「スイカ」「もも」「みかん」という要素を入れる。
  2. for (const basket of fruits)
    配列「fruits」の中から、1つずつ果物を取り出して「basket」という変数に入れる繰り返しを始める。
  3. if (basket === "スイカ") continue;
    もし取り出した果物(basket)が「スイカ」だったら、このループの中の処理はスキップして次の果物に進む。
  4. console.log(basket);
    変数「basket」の中身をコンソール画面に表示する。

【配列のコード】

js
コピー 拡大
const fruits = ["りんご", "スイカ", "もも", "みかん"];
コード 種別 意味
const 変数宣言
キーワード
変更できない変数(箱)を作る宣言
animals 配列名 リストの名前
= 代入演算子 右のものを左に入れる
[] 配列 リスト
"りんご"
"スイカ"
"もも"
"みかん"
要素 リストの中身
"" 囲い記号 囲まれたものを文字列として扱う
, カンマ演算子 左から順に実行して結果を返す
; 区切り記号 文末につける記号

 
【for…of文のコード】

js
コピー 拡大
for (const basket of fruits) {
  if (basket === "スイカ") continue;  // スイカはスキップ
  console.log(basket);
}
コード 種別 意味
for 制御構文 指定した回数だけ処理をくり返す命令
() カッコ for文の制御部分
const 変数宣言
キーワード
変更できない変数(箱)を作る宣言
basket 変数名 変数(箱)の名前
of 演算子 〜の中身を1つずつ取り出す
fruits 配列名 リストの名前
{} ブロック
スコープ
{}内にくり返したい処理を書く
if 条件分岐 もし〇〇なら処理を分ける
basket === "スイカ" 条件式 basketの中身が「スイカ」と等しいかどうか
=== 厳密等価
演算子
左右の値が「型も値も同じ」かどうか比較
continue 制御文 この回の処理をスキップして次のループへ進む
console.log() 出力命令 ()の中身をコンソールに表示

breakで処理を途中で抜ける

for…of文の処理を途中で中断(break)
break(ブレイク)を使って処理を途中で抜ける方法です。
js
コピー 拡大
const numbers = [1, 2, 3, 4, 5];

for (const num of numbers) {
  if (num > 3) break; // 3以上なら処理を中断
  console.log(num);
}
コンソール(実行結果)
コピー 拡大
1
2
3
  1. const numbers = [1, 2, 3, 4, 5];
    「numbers」という名前の変数を作り、配列[]の中に「1,2,3,4,5」という数値を入れる。
  2. for (const num of numbers)
    配列「numbers」の中から1つずつ数値を取り出して「num」という変数に入れる繰り返しを始める。
  3. if (num > 3) break;
    もし取り出した数字が「3より大きい」なら処理を終了する。
  4. console.log(num);
    変数「num」の中身をコンソール画面に表示する。

【配列のコード】

js
コピー 拡大
const numbers = [1, 2, 3, 4, 5];
コード 種別 意味
const 変数宣言
キーワード
変更できない変数(箱)を作る宣言
numbers 配列名 リストの名前
= 代入演算子 右のものを左に入れる
[] 配列 リスト
1
2
3
4
5
要素 リストの中身
"" 囲い記号 囲まれたものを文字列として扱う
, カンマ演算子 左から順に実行して結果を返す
; 区切り記号 文末につける記号

 
【for…of文のコード】

js
コピー 拡大
for (const num of numbers) {
  if (num > 3) break;
  console.log(num);
}
コード 種別 意味
for 制御構文 指定した回数だけ処理をくり返す命令
() カッコ for文の制御部分
const 変数宣言
キーワード
変更できない変数(箱)を作る宣言
num 変数名 変数(箱)の名前
(ここでは配列の要素を入れる箱)
of 演算子 〜の中身を1つずつ取り出す
numbers 配列名 リストの名前
{} ブロック
スコープ
{}内にくり返したい処理を書く
if 条件分岐 もし〇〇なら処理を分ける
num > 3 条件式 num3未満の間は処理を繰り返す
> 比較演算子 左が右より大きい
break 制御文 ループを途中で終了して抜ける
console.log() 出力命令 ()の中身をコンソールに表示

returnを使う

for…of文でreturnを使う
for…of文でreturnを使う方法です。
js
コピー 拡大
function findFirstBiggerThanThree(numbers) {
  for (const num of numbers) {
    if (num > 3) {
      return num;  // 3より大きい数字を見つけたら返す
    }
  }
  return null;  // 見つからなければnullを返す
}

const result = findFirstBiggerThanThree([1, 2, 3, 4, 5]);
console.log(result);
コンソール(実行結果)
コピー 拡大
4
  1. function findFirstBiggerThanThree(numbers)
    「findFirstBiggerThanThree(3より大きい最初の数字を見つける)」という関数を作り、引数として「numbers」という配列を受け取る。
  2. for (const num of numbers)
    配列「numbers」の中から1つずつ数値を取り出して「num」という変数に入れる繰り返しを始める。
  3. if (num > 3) {return num;}
    「num」が3より大きければ、その数字をすぐに関数の結果として返して終了する。
  4. return null;
    もし最後まで3より大きい数字がなければ「null(値がない状態)」を返す。
  5. const result = findFirstBiggerThanThree([1, 2, 3, 4, 5]);
    console.log(result);

    配列 [1, 2, 3, 4, 5] を関数に渡して最初に3より大きい数字を探して「result」に代入し、結果を表示する。
js
コピー 拡大
function findFirstBiggerThanThree(numbers) {
  for (const num of numbers) {
    if (num > 3) {
      return num;  // 3より大きい数字を見つけたら返す
    }
  }
  return null;  // 見つからなければnullを返す
}

【関数のコード】

コード 種別 意味
function 関数宣言 「これから〇〇という処理をまとめた箱を作るよ」という宣言
findFirstBiggerThanThree 関数名 関数の名前
numbers 引数 関数に渡される配列
for 制御構文 指定した回数だけ処理をくり返す命令
() カッコ for文の制御部分
const 変数宣言
キーワード
変更できない変数(箱)を作る宣言
num 変数名 変数(箱)の名前
of 演算子 〜の中身を1つずつ取り出す
numbers 配列名 リストの名前
if 条件分岐 もし〇〇なら処理を分ける
num > 3 条件式 num3未満の間は処理を繰り返す
> 比較演算子 左が右より大きい
return 制御構文 関数内で処理した結果を結果を返す
num 変数名 変数(箱)の名前
null 「何もない」ことを表す特別な値
; 区切り記号 文末につける記号

 
【関数の呼び出しと結果表示のコード】

js
コピー 拡大
const result = findFirstBiggerThanThree([1, 2, 3, 4, 5]);
console.log(result);
コード 種別 意味
const 変数宣言
キーワード
変更できない変数(箱)を作る宣言
result 変数名 変数(箱)の名前
(ここでは関数の返り値を入れる箱)
findFirstBiggerThanThree() 関数
呼び出し
引数の配列から3より大きい最初の数字を返す関数を実行
[1, 2, 3, 4, 5] 配列 数値のリスト
console.log() 出力命令 ()の中身をコンソールに表示

indexを取得

for…of文でindex(インデックス)を取得
for…of文でインデックス(番号)を使う方法です。
js
コピー 拡大
const animals = ["ねこ", "いぬ", "うさぎ"];

for (const [index, animalhouse] of animals.entries()) {
  console.log(`${index}番目は ${animalhouse} です`);
}
コンソール(実行結果)
コピー 拡大
0番目は ねこ です  
1番目は いぬ です  
2番目は うさぎ です
  1. const animals = ["ねこ", "いぬ", "うさぎ"];
    「animals」という名前の変数を作り、配列[]の中に「ねこ」「いぬ」「うさぎ」という要素を入れる。
  2. for (const [index, animalhouse] of animals.entries())
    「animals」の中から1つずつ要素を取り出して、そのときの順番(index)と中身(animal)をセットで「index」と「animal」という変数に入れる繰り返しを始める。
  3. console.log(`${index}番目は ${animal} です`);
    何番目の動物か(index)と、その動物の名前(animal)を使って「〇番目は △△ です」とコンソール画面に表示する。

【配列のコード】

js
コピー 拡大
const animals = ["ねこ", "いぬ", "うさぎ"];
コード 種別 意味
const 変数宣言
キーワード
変更できない変数(箱)を作る宣言
animals 配列名 リストの名前
= 代入演算子 右のものを左に入れる
[] 配列 リスト
"ねこ"
"いぬ"
"うさぎ"
要素 リストの中身
"" 囲い記号 囲まれたものを文字列として扱う
, カンマ演算子 左から順に実行して結果を返す
; 区切り記号 文末につける記号

 
【for…of文のコード】

js
コピー 拡大
for (const [index, animalhouse] of animals.entries()) {
  console.log(`${index}番目は ${animalhouse} です`);
}
コード 種別 意味
for 制御構文 指定した回数だけ処理をくり返す命令
() カッコ for文の制御部分
const 変数宣言
キーワード
変更できない変数(箱)を作る宣言
index 変数名 変数(箱)の名前
(ここでは配列の番号を入れる箱)
animalhouse 変数名 変数(箱)の名前
(ここでは配列の要素を入れる箱)
of 演算子 〜の中身を1つずつ取り出す
animals 配列名 リストの名前
entries() メソッド 配列のキー/値(番号/要素)を取り出す機能
{} ブロック
スコープ
{}内にくり返したい処理を書く
console.log() 出力命令 ()の中身をコンソールに表示
`` テンプレート
リテラル記号
文字列の始まりと終わりを示す
${} プレース
ホルダ
{}内で指定した変数の中身を入れる

Setの値を取得

for...ofを使ってSetオブジェクトの値を取得
for...ofを使って、Setオブジェクトの値を取り出す方法です。
js
コピー 拡大
const fruits = new Set(["みかん", "もも", "バナナ", "スイカ"]);

for (const basket of fruits) {
  console.log(basket);
}
コンソール(実行結果)
コピー 拡大
みかん
もも
バナナ
スイカ
  1. const fruits = new Set(["みかん", "もも", "バナナ", "スイカ"]);
    「fruits」という名前の変数を作り、[]の中に「みかん」「もも」「バナナ」「スイカ」という値を入れる。
  2. for (const basket of fruits)
    変数「fruits」の中から1つずつ要素を取り出して、「basket」という変数に入れる繰り返しを始める。
  3. console.log(basket);
    変数「basket」の中身をコンソール画面に表示する。

【配列のコード】

js
コピー 拡大
const fruits = new Set(["みかん", "もも", "バナナ", "スイカ"]);
コード 種別 意味
const 変数宣言
キーワード
変更できない変数(箱)を作る宣言
fruits オブジェクト名 Setオブジェクトの名前
= 代入演算子 右のものを左に入れる
new Set オブジェクト
生成
重複するを入れられないSetオブジェクトを作成
[] 配列 リスト
"みかん"
"もも"
"バナナ"
"スイカ"
配列の中身
"" 囲い記号 囲まれたものを文字列として扱う
, カンマ演算子 左から順に実行して結果を返す
; 区切り記号 文末につける記号

 
【for…of文のコード】

js
コピー 拡大
for (const basket of fruits) {
  console.log(basket);
}
コード 種別 意味
for 制御構文 指定した回数だけ処理をくり返す命令
() カッコ for文の制御部分
const 変数宣言
キーワード
変更できない変数(箱)を作る宣言
basket 変数名 変数(箱)の名前
of 演算子 〜の中身を1つずつ取り出す
fruits オブジェクト名 Setオブジェクトの名前
{} ブロック
スコープ
{}内にくり返したい処理を書く
console.log() 出力命令 ()の中身をコンソールに表示

Mapのキーと値を取得

for...ofを使って、Mapオブジェクトの「キー」と「値」を取得
for...ofを使って、Mapオブジェクトの「キー」と「値」を取り出す方法です。
js
コピー 拡大
const userAges = new Map([
  ["田中", 25],
  ["鈴木", 30],
  ["佐藤", 28]
]);

for (const [name, age] of userAges) {
  console.log(`${name}さんは${age}歳です`);
}
コンソール(実行結果)
コピー 拡大
田中さんは25歳です
鈴木さんは30歳です
佐藤さんは28歳です
  1. const userAges = new Map([]);
    「userAges」という名前の変数を作り、Mapオブジェクト[]の中に「キー,値」を入れる。
  2. for (const [name, age] of userAges)
    Mapオブジェクトから1組ずつ「キー」と「値」を取り出して「name」と「age」という変数に入れる。
  3. console.log(`${name}さんは${age}歳です`);
    「◯◯(index)さんは◯◯(animal)歳です」とコンソール画面に表示する。

【配列のコード】

js
コピー 拡大
const userAges = new Map([
  ["田中", 25],
  ["鈴木", 30],
  ["佐藤", 28]
]);
コード 種別 意味
const 変数宣言
キーワード
変更できない変数(箱)を作る宣言
userAges オブジェクト名 Mapオブジェクトの名前
= 代入演算子 右のものを左に入れる
new Map オブジェクト
生成
キーのペアを持つMapオブジェクトを作成
[] 配列 リスト
["田中", 25]
["鈴木", 30]
["佐藤", 28]
要素
(キー、値)
キーのペア
"" 囲い記号 囲まれたものを文字列として扱う
, カンマ演算子 左から順に実行して結果を返す
; 区切り記号 文末につける記号

 
【for…of文のコード】

js
コピー 拡大
for (const [name, age] of userAges) {
  console.log(`${name}さんは${age}歳です`);
}
コード 種別 意味
for 制御構文 指定した回数だけ処理をくり返す命令
() カッコ for文の制御部分
const 変数宣言
キーワード
変更できない変数(箱)を作る宣言
[name, age] 分割代入 1組の要素(["田中", 25] など)をnameageに分けて代入
of 演算子 〜の中身を1つずつ取り出す
userAges オブジェクト名 Mapオブジェクトの名前
{} ブロック
スコープ
{}内にくり返したい処理を書く
console.log() 出力命令 ()の中身をコンソールに表示
`` テンプレート
リテラル記号
文字列の始まりと終わりを示す
${} プレース
ホルダ
{}内で指定した変数の中身を入れる

DOMを取得

for…of文でHTMLのDOM要素を取得
for…of文でHTMLのDOM要素を取得する方法です。
DOM要素とは、ウェブページ内の「パーツ」のことです。

たとえば「見出し」「文章」「画像」「ボタン」「リスト」など、ページ内にあるそれぞれのパーツがDOM要素に当たります。

用語 意味
DOM ウェブページの構造を表すツリー状のもの
DOM要素 ページ内のパーツ(見出し、画像など)
HTML
コピー 拡大
<ul>
  <li>りんご</li>
  <li>みかん</li>
  <li>バナナ</li>
</ul>
js
コピー 拡大
const items = document.querySelectorAll("li");

for (const item of items) {
  console.log(item.textContent);
}
コンソール(実行結果)
コピー 拡大
りんご
みかん
バナナ
  1. const items = document.querySelectorAll("li");
    HTMLの中からliの要素を抜き出し「items」という変数に保存する。
  2. for (const item of items)
    変数「items」の中から1つずつliの要素を取り出して「item」という変数に入れる繰り返し処理。
  3. console.log(item.textContent);
    「item」の中にあるテキストのみをコンソール画面に表示する。

【HTML要素の取得するコード】

js
コピー 拡大
const items = document.querySelectorAll("li");
コード 種別 意味
const 変数宣言
キーワード
変更できない変数(箱)を作る宣言
items 変数名 変数(箱)の名前
(liの要素をまとめて入れる変数の名前)
= 代入演算子 右のものを左に入れる
document オブジェクト 現在のHTMLページを表す特別なオブジェクト。
querySelectorAll(); メソッド 指定したパーツ(特定の要素)を取得
querySelectorAll("li"); メソッド liの要素を取り出す命令
; 区切り記号 文末につける記号

 
【for…of文のコード】

js
コピー 拡大
for (const item of items) {
  console.log(item.textContent);
}
コード 種別 意味
for 制御構文 指定した回数だけ処理をくり返す命令
() カッコ for文の制御部分
const 変数宣言
キーワード
変更できない変数(箱)を作る宣言
item 変数名 変数(箱)の名前
of 演算子 〜の中身を1つずつ取り出す
items 変数名 変数(箱)の名前
(HTMLの中から取得した要素が入っている)
{} ブロック
スコープ
{}内にくり返したい処理を書く
console.log() 出力命令 ()の中身をコンソールに表示
item.textContent プロパティ参照 liの要素の中に書かれているテキストを取得

4. よくある質問

for…of文に関するよくある質問

ここではfor…of文に関するよくある質問をご紹介しています。

配列とは?

「配列(はいれつ)」とは、複数の値(データ)をひとまとめにして管理できるリストのようなものです。

たとえば、複数の人物の名前を処理したいときに、下記のようにひとつずつ変数を作るのは大変ですよね。

js
コピー 拡大
const name1 = "山田花子";
const name2 = "鈴木ゆき";
const name3 = "松田次郎";

こんなときに便利なのが「配列」です。

配列を使えば、次のように複数の値をひとつの変数でまとめて管理することができます。

js
コピー 拡大
const names = ["山田花子", "鈴木ゆき", "松田次郎"];

このように配列を使うことで、コードがすっきりして読みやすくなったり、データの追加や繰り返し処理がかんたんになるメリットがあります。

配列はJavaScriptでとてもよく使われる基本のしくみなので、使いこなせるようにしておくことをおすすめします。

オブジェクトに使える?

for…of文はオブジェクトに使うことはできません。

なぜなら、オブジェクトは「iterator(イテレータ)を持ったデータ」ではないからです。

詳しい情報については「使える対象データ」をご覧ください。

for…in文との違い

for…of文とfor…in文との違いは次のようになります。

for…of for…in
対象 配列
文字列
Map/Set
など
オブジェクト
処理方法 順番どおりに1つずつ 1つずつ(順番は保証されない)
制御構文使用 break
continue
return
break
continue
return
主な用途 様々なデータを順番に処理したいとき オブジェクトのプロパティを調べたいとき
for…in文についてもっと詳しく知りたい方はこちらをご覧ください。
【ES6】JavaScript:for...in文とは?書き方を解説!【ES6】JavaScript:for…in文とは?書き方を解説!

for…ofとforEachの違い

for…of文とforEach文はどちらも「繰り返し処理」をする構文ですが、次のような違いがあります。

for…of forEach
対象 配列
文字列
Map/Set
など
配列
制御構文使用 break
continue
return
return
主な用途 様々なデータを順番に処理したいとき 配列を順番に処理したいとき

for await…of文とは?

for await…of文は、1つずつ順番にゆっくり取り出すことができる構文です。

通常のfor…of文との違いは次のようになります。

構文 意味
for(of) すぐに全部のデータを取り出す
for await(of) データを1つずつ順番を待ちながらゆっくり取り出す
for await…of文を使えば、下記のように「1秒ごとに果物の名前をコンソールに表示する」なんてこともできます。

ぶたさん

js
コピー 拡大
async function* getFruits() {
  const list = ['りんご', 'みかん', 'ぶどう'];
  for (let i = 0; i < list.length; i++) {
    await new Promise(function(resolve) {
      setTimeout(function() {
        resolve();
      }, 1000); // 1秒待つ
    });
    yield list[i];
  }
}

async function showFruits() {
  for await (const fruit of getFruits()) {
    console.log(fruit);
  }
}

showFruits();
コンソール(実行結果)
コピー 拡大
りんご // 1秒後に表示
みかん // 1秒後に表示
ぶどう // 1秒後に表示

5. まとめ

JavaScript:for…of文まとめ

for…of文は、配列や文字列など「イテレータを持ったデータ」を、順番に1つずつ取り出して処理するための構文です。

JavaScriptでループ処理をシンプルに書きたいときに便利で、特に配列などの中身を順番に処理したい場面でよく使われます。

forEach文と似ていますが、break,continue,returnなどが使えるため、処理の流れを途中で止めたり飛ばしたりすることができる特徴があります。

まとめ
  • for…of文は配列や文字列などを順番どおりに取り出すことができる構文
  • イテレータを持ったデータならすべて使える
  • continuebreakを使うことができる
  • forEach文と似ているが自由度が高い