JavaScriptの行末セミコロン
一種のポエムです。自分は行末セミコロンを書かない派です。
仕様
英語版はここです。
和訳
- パース中に文法上許可されないようなトークン(offending token)に出会って、かつ以下の条件のどれか1つ以上を満たしていればセミコロンを挿入する
- offending tokenとその前のトークンの間に1つ以上のLineTerminatorがある
- offending tokenが}である
- 1つ前のトークンが ) であり、セミコロンを挿入時にそのセミコロンが do-while 文の最後となるセミコロンとして扱える
- EOF
- パース中文法としては正しいが、文法の定義で "[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も書かないので困ることも少なそうです。