セミコロンの自動挿入

メモ

  • 省略されたセミコロンはルールに従い自動挿入
  • セミコロンの自動挿入ルール (下記の場合、セミコロンを自動挿入)
    • :構文解析で違反トークンが下記の場合
      • 違反トークンの前がいくつかの行終端子で区切られている
      • 違反トークンが、"}"
      • 直前のトークンが ")" でセミコロンを挿入すると do-while の終了のセミコロンとなる
       ; :自動挿入セミコロン
      
      {var x = 1 ; } do {} while(false) ;  var y = 2 ; 
      console.log(x, y);
      
    • :入力ストリームが終了し(例:プログラムファイルの最後に改行なし)、構文解析が不可
      var x = 0 ; 
      
    • :トークン中のの位置に、 行終端子 (例外:空文・for文の2つのセミコロンの代わり)
      下記が対象
      • 【左辺式】 ++
      • 【左辺式】 --
      • continue  【ラベル識別子】;
      • break  【ラベル識別子】;
      • return  【式】;
      • throw  【式】;
      • 【アロー関数パラメータ】 => 【関数本体】
      • yield  * 【式】
      • yield  【式】
      var x = 1, y = 2;
      x ;    // 改行があると x++ と認識不可
      ++
      y ;    // 改行がありでも ++y と認識
      console.log(x, y);  // 出力:1 3
      
      outer1:
      for (var i = 0; i < 3; i++) {
        for (var j = 0; j < 3; j++) {
          if (0 < j) {
            break outer1;    // 通常:ラベルとして認識可
          }
          console.log(i, j);
        }
      }
      // 出力:0 0
      
      outer2:
      for (var i = 0; i < 3; i++) {
        for (var j = 0; j < 3; j++) {
          if (0 < j) {
            break ; 
                  outer2;    // ラベルとして認識不可
          }
          console.log(i, j);
        }
      }
      // 出力:0 0
      // 出力:1 0
      // 出力:2 0
      
      function func() {
        var x = 1;
        return ; 
              x;    // 戻り値として認識不可
      }
      console.log(func());  // 出力:undefined
      
      if (true)
         挿入なし  // 空文
      else       // エラー
        console.log("else");
      
      for (var i = 0  挿入なし
          i < 10  挿入なし  // エラー
          i++  挿入なし
      ) { }