JavaScript/セミコロンの自動挿入

セミコロンの自動挿入(Automatic Semicolon Insertion; ASI)編集

C言語系言語では、セミコロン(;)は文の終わりを表します。他のC言語系言語とは異なり、JavaScriptでは文の最後にセミコロンを使用することを強制していません。その代わり、セミコロンは任意でありJavaScriptのインタープリタがコードを実行する際に「インテリジェントに」追加します。


JavaScriptでは、次のような場合にセミコロンが自動的に挿入されます[1]

  1. 2つの文が行終端記号で区切られている場合
  2. 2つの文が閉じ括弧('}')で区切られている場合
  3. breakcontinuereturnthrowの後に行終端記号がある場合。

ASIはコードを書きやすくしますが(セミコロンをすべて入力する必要はありません)、実際には、セミコロンがないとプログラムのデバッグが難しくなります。このため、ステートメントの最後にセミコロンを使用することはベスト・プラクティスとして広く認識されています。しかし、ASIの存在は何を探すべきかを知らなければトラブルシューティングが困難ないくつかのバグを作り出す可能性があります。

編集

具体的なASIの振る舞い
入力されたコード 実際の解釈 修正されたコード
return
2*a + 1;
return;
2*a + 1;
return 2*a + 1;
function getObject() {
  return
  {
    // いくつかの行
  };
}
function getObject() {
  return;
  {
    // いくつかの行
  };
}
function getObject() {
  return {
    // いくつかの行
  };
}
i
++;
i;
++;
i++;
if (i === 5)
  // ここにはセミコロンを期待しています
else
  foo = 0;
if (i === 5)
  // ここにセミコロンはありません!
else
  foo = 0;
if (i === 5){
  // コード
  }
  else {
    foo = 0;
  }

最初のケースでは、プログラマは 2*a + 1 を返すことを意図していましたがコードは何も返しませんでした。同様に、2番目のケースではプログラマは中括弧{}で囲まれた行を返すことを意図していましたが、コードは何も返しませんでした。このように、JavaScriptには奇妙な点があるため文の中で改行したり開始波括弧を別の行にしたりしないことがベスト・プラクティスとされています。

脚注編集

  1. ^ Colin J. Ihrig (2012-03-09). "The Dangers of JavaScript's Automatic Semicolon Insertion" (in English) (HTML). cjihrig.com. 2017-03-29にオリジナルからアーカイブされています(2021-07-12閲覧)。

外部リンク編集