キーワードforは、異なる四種類の反復構文で使われます。
for文は、C言語風の反復構文です[https://tc39.es/ecma262/#sec-for-statement ECMA-262::14.7.4 The for Statement]。
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文は、文字列をキーとするオブジェクトのすべての列挙可能なプロパティを反復処理しますSymbol をキーとするプロパティは無視します[https://tc39.es/ecma262/multipage/ecmascript-language-statements-and-declarations.html#sec-for-in-and-for-of-statements ECMA-262::14.7.5 The for-in, for-of, and for-await-of Statements]。
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文は、String、Array、TypedArray、Map、Setと配列似なオブジェクト（例えば、ArgumentsやNodeList）、ユーザー定義の反復可能オブジェクトを反復するループを作成します。このループはオブジェクトの各プロパティの値に対して実行されるステートメントを持つカスタム反復フックを呼び出します。
for ( 変数宣言 of 反復対象オブジェクト )
  文
変数がブロックスコープで宣言された場合、変数はfor...of文を抜けると揮発します。
const array = ['A', 'B', 'C'];
for (const element of array) {
  console.log(element);
}
実行結果
 A
 B
 C
for await... of文は、非同期イテレート可能なオブジェクトや同期反復可能なオブジェクトを反復するループを作成します。これらのオブジェクトには、String、Array、TypedArray、Map、Setと配列似なオブジェクト（例えば、ArgumentsやNodeList）、ユーザー定義の反復可能オブジェクトが含まれます。オブジェクトの各プロパティの値に対して実行される文を持つカスタム反復フックを呼び出します。for await... of文は、非同期関数の内部でのみ使用できます。。
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