キーワード for

編集

キーワードforは、異なる四種類の反復構文で使われます。

for文

編集

for文は、C言語風の反復構文です[1]

構文

編集
for ( 初期化式 ; 条件式 ; 反復式 )
  

while文による等価なプログラム

{
  初期化式 ;
  while ( 条件式 ) {
    
    反復式 ;
  }
}

外側のブロックは、初期化式がブロックスコープを持つ変数の宣言であった場合 for文 を抜けるとスコープから出ることを表現した。

const array = [2, 3, 5, 7, 10, 11];
let result = 1;
for (let i = 0, len = array.length; i < len; i++) {
  result += array[i];
  console.log(`result = ${result}`);
  if (result % 2 == 0) {
    continue;
  }
  if (result > 20) {
    break;
  }
}

実行結果

result = 3
result = 6
result = 11
result = 18
result = 28
result = 39

for...in文

編集

for...in文は、文字列をキーとするオブジェクトのすべての列挙可能なプロパティを反復処理します[2][3]

構文

編集
for ( 変数宣言 in 反復対象オブジェクト )
  

変数がブロックスコープで宣言された場合、変数はfor...in文を抜けると揮発します。

const object = { a: 10, b: 20, c: 30 };

for (const property in object) {
  console.log(`${property}: ${object[property]}`);
}

実行結果

a: 10
b: 20
c: 30

for...of文

編集

for...of文は、String、Array、TypedArray、Map、Setと配列似なオブジェクト(例えば、ArgumentsやNodeList)、ユーザー定義の反復可能オブジェクトを反復するループを作成します。このループはオブジェクトの各プロパティの値に対して実行されるステートメントを持つカスタム反復フックを呼び出します[3]

構文

編集
for ( 変数宣言 of 反復対象オブジェクト )
  

変数がブロックスコープで宣言された場合、変数はfor...of文を抜けると揮発します。

const array = ['A', 'B', 'C'];

for (const element of array) {
  console.log(element);
}

実行結果

A
B
C

for await... of文

編集

for await... of文は、非同期イテレート可能なオブジェクトや同期反復可能なオブジェクトを反復するループを作成します。これらのオブジェクトには、String、Array、TypedArray、Map、Setと配列似なオブジェクト(例えば、ArgumentsやNodeList)、ユーザー定義の反復可能オブジェクトが含まれます。オブジェクトの各プロパティの値に対して実行される文を持つカスタム反復フックを呼び出します。for await... of文は、非同期関数の内部でのみ使用できます。[3]

構文

編集
for await ( 変数宣言 of 反復対象オブジェクト )
  

変数がブロックスコープで宣言された場合、変数はfor await...of文を抜けると揮発します。

async function* asyncShift() {
  for (let i = 1, len = 2 ** 16; i < len; yield i <<= 3)
    ;
}

(async function() {
  for await (const num of asyncShift()) {
    console.log(num);
  }
})();

実行結果

8
64
512
4096
32768
262144

脚注

編集
  1. ^ ECMA-262::14.7.4 The for Statement
  2. ^ Symbol をキーとするプロパティは無視します
  3. ^ 3.0 3.1 3.2 ECMA-262::14.7.5 The for-in, for-of, and for-await-of Statements

関連項目

編集