ぽっかめろん

ゲームとかプログラミングとか

JavaScriptの行末セミコロン

一種のポエムです。自分は行末セミコロンを書かない派です。

仕様

英語版はここです。

和訳

  1. パース中に文法上許可されないようなトークン(offending token)に出会って、かつ以下の条件のどれか1つ以上を満たしていればセミコロンを挿入する
    • offending tokenとその前のトークンの間に1つ以上のLineTerminatorがある
    • offending token}である
    • 1つ前のトークンが ) であり、セミコロンを挿入時にそのセミコロンが do-while 文の最後となるセミコロンとして扱える
  2. EOF
  3. パース中文法としては正しいが、文法の定義で "[no LineTerminator here]" が入っている場所に LineTerminator が出現した場合、パースしているトークンの直前にセミコロンを挿入する

ただし、セミコロン挿入後に空文となるか、for文のヘッダーのセミコロンになる場合は挿入しない

3番目が引っかかりやすいポイントですね。

  return
    true;

とかの奴です。ひとまず ReturnStatement, ThrowStatement, ArrowFunction, YieldExpression に注意すれば問題ありません。

逆に挿入されなくて困るパターンとしては

a = b + c
(d + e).print()

if (a > b)
else c = d

が挙げられています。「行頭にカッコを置かない」ことを守ればよさそうです。最近はあまりIIFEも書かないので困ることも少なそうです。