JavaScript では、 セミコロンは 基本は 省略可能です。これはよく知られてると思います。しかし、 どのセミコロンが本当に省略可能なセミコロンなのかきちんと知ってる人は少ないでしょう。今回はその説明です。
前提知識
省略可能かどうかの説明には文、 単文 そして 複文の説明が必要です。
JavaScript の プログラム は文のみで構成されています。文というのは for文や宣言文に始まる構文のことです。一覧は 文 - JavaScript | MDN をご覧ください。
さて、 文は分かりました。では、 単文と複文とは何でしょうか? 単文は読んで字のごとく 一つの文 のことです。対して複文はいくつかの単文をまとめてそう呼びます。複文は連続した単文ならどうとってもいいので、 文脈でどれを複文と呼んでいるのか 判断する必要があります。
ここでポイントになるのは複数の単文を1行にすることができるということです。コードを圧縮すると1行になりますよね。あれは 複文 を1行にしているわけです。しかし、 単文を1行に連ねるには条件があります。それは単文をセミコロンで区切ることです。
通常単文は行末のセミコロンもしくは改行で区切られます。そのため、 行末のセミコロンは省略可能なのです。
省略すべきセミコロン
さて、ここまで省略可能なセミコロンを見てきました。 しかし、中には 省略すべきセミコロンというものがあります。 それはどのセミコロンののことでしょうか?
それは ブロック直後のセミコロン です。ブロック直後のセミコロンは空文を作ります。空文は読んで字の如く全く意味を成しません。つまり、無駄なセミコロンなのです。 全く意味がない1文字を打つ暇があったら別のプログラムを書いたほうがいいですよね。
おまけ
ここで一言。先ほどJavaScript は単文と複文のみからなるといいました。ではブロックとは何なのでしょうか?ブロックは単文を1つの文にまとめる役割を持っています。for はブロックがない場合単文しか実行しませんよね。でもブロックなら複文を処理できる。これはまさに複文を単文にしているためです。if や else などブロックもしくは単文をとる文がブロックあるものないものとあるのはこれが所以です。