◆ セミコロン無し派の書き方の文頭セミコロン
◆ 去年一年分のコード調べでは それすらいらなかった
◆ OSS のコード見てみても文頭セミコロンのケースは
  ◆ 代入時の左辺が複雑なケース
  ◆ 配列の forEach メソッドくらい

セミコロン戦争

JavaScript ではセミコロンはなくてもよくて書きたい派の人と書きたくない派の人たちがいます
私は書きたくない方です

書かない場合に注意することに 前後の行が意図せず結合されてしまうという点があります
Python などだと構文的に許してないからそういう事は起きないのですが JavaScript はわりと自由に好きなところで改行しても結合してくれる分不便なところもあります
それを特別意識しなくていい方法として 「(」 や 「[」 から文を始めたい場合は最初に 「;」 から書くという方法があります

;(function(){
// something
})()

こういうのを見たことある人は多いでしょう
これさえやっておけばセミコロンを最後に書く必要はなくて快適なのですが この最初のセミコロンを受け入れられないって人もいます

セミコロン書かない場合は

しかしよく考えてみると 「;」 はじまりのコードはほぼ書くことがありません
去年一年を思い返してもコンソール以外で書いた覚えが全然ないです
通常何かの処理をしたらそれを変数に入れたり出力したり return するので 式を実行するだけというのはほぼないです
ですがコンソールでは評価すればそれが出力される REPL なので 「(1 + 2) * 3」 という計算結果を見るだけでも 「(」 から始まってます
コンソールでの実行は特別なのでここでは除外します

先頭セミコロン使ってなかった

去年書いたコードでちゃんと残してるコードから .js ファイルに絞って 「;」 で検索かけてみても for の区切りや埋込 CSS 以外で 「;」 はマッチしませんでした
規模感としては 一番大きな SPA アプリでクライアントもサーバも JavaScript のもので

ファイル数: 150
ファイルサイズ: 1 MB
行数: 25,000

だいたいこれくらいです
もちろん全部自分で書いたコードで node_modules とかは除外してます

これだけ書いても 「;」 から始まる文がひとつもないくらいですし セミコロン完全いらない気がしますね
セミコロンはいらない子

記号から始めない

基本 「(」 や 「[」 を使うのは計算式の値を求める部分であって 代入先である左辺側にはほぼこないです
return や関数の引数などに書く場合も文頭には来ないです

なので意図的にやらなければ 「(」 などから始まることは無いと思います

()

その場書き捨てみたいなコードだと雑なものなので

(a || b).p = d

とかやりがちですが 書き捨てじゃなくちゃんとした後から見直すようなものだと 「()」 使ってまで無理に短く書いたようなのはわかりづらいので適度に分けてます
この例くらいだと別にいいじゃん と思えそうですが 実際のものだと a, b, p, d にあたるのがもう少し長く複雑なのでみやすさを気にすると分けたくなります
基本代入される側 (左辺) に 「()」 使うことなんて無いと言っていいくらいです

即時実行

関数の即時実行では 「(」 から始まりがちです

(function(){/**/})()

ですが 基本返り値を返した結果を return だったり代入するので

const a = (function(){})()

return (function(){})()

のようになって 「(」 からは始まりません

代入しないなら関数呼び出しにせずそのまま中身をそこにかけばいいです
スコープを作りたいなら let/const はブロックスコープなので 「{}」 で十分です

// 〇〇系の処理
{
// something
}

// ✕✕系の処理
{
// something
}

また昔はグローバルに配置したくないというだけで 即時実行を使うこともありましたが module ではトップレベルがグローバルにならないので外側に全体を囲む即時関数実行を書く必要はありません

[]

配列カッコはリテラルで配列を作れるので昔はこういうのがありました

[1, 2, 3].map(/**/).***

[1, 2, 3].forEach(/**/)

上は map なら返した値を使うべきなので 代入や return しないならチェーンの最後で forEach や some などしてるのでしょう
下の forEach は Array.of を使うと長くなるので昔は仕方ないところではありました

ですが 今では for-of を使うべきで forEach はすでに関数として処理内容が用意されてるわけでもなければ不要です
for-of のほうが break/continue/yield/return とできることも多く 関数呼び出しのコストもないので早いです

for(const item of [1, 2, 3]){
/* */
}

break が使えるので最初の 1 回だけ処理したいときに some でやる必要もないです
返り値がある some のほうが良い場合もありますが 返り値を使うならそれを代入などするので 「[」 からは始まりません

/xxxx/

正規表現リテラルも一応 「;」 つけるべき対象です

コンソールでは

/xxxx/.exec("yyyy")

とよくやるものの 実際のコードでは結果を代入したり if 文の条件式を書くところに書いたりです

/xxxx/.test("yyyy") && something()

と できなくはないものの これをやろうとしたことはいまのとこないです

``

テンプレートストリングもタグ機能があるので行を結合できます
ですが これも代入するか for-of などに使うかで テンプレートストリングから始めて メソッドチェーンだけで終わる式を書くことがないです

for(const c of `a,b,c`.split(",")){
/* */
}

テンプレートストリングは改行できるので Python 経験者がドキュメント書くみたいな使い方するかもですが JavaScript は /* */ で複数行コメントができます
「${}」 で埋め込み扱いになりますし コメントで良いものを無意味に文字列として評価するだけ無駄ですし そういう使い方はまず無いでしょう

OSS

自分以外が書いた有名なライブラリではどんな感じなのかも気になったので見てみました

Vue.js

セミコロン使わないもので有名である程度の規模のプロジェクトと考えると Vue.js が思いついたのでこれのソースを見てみました
範囲は 2.6.10 の src フォルダの中だけです
examples とか test は対象外です

grep の結果を眺めた感じでは
for 文の区切りや文字列の中 それと flow の type 定義のところでした
flow の type については JavaScript の構文ではないのでスキップします

みたところセミコロンが必要な箇所は文末ではなく文頭に置くスタイルのようなので 半角スペースのみ許容して行の最初にセミコロンが出るところで調べると 6 つだけでした
こういうのです

;(currentParent.scopedSlots || (currentParent.scopedSlots = {}))[name] = element

;(owner: any).$on('hook:destroyed', () => remove(owners, owner))

;['ResourceHints', 'State', 'Scripts', 'Styles'].forEach(type => {

やはり 複雑な代入か配列リテラルの forEach ですね
2 つめのは flow の型のキャストで 通常の JavaScript の構文ではエラーになるものです

Redux

Redux もセミコロンを使わないプロジェクトなので見てみました
4.0.0 の src フォルダが対象です

小さめのプロジェクトというだけあって 「;」 は for 文の 4 行だけでした
文頭 「;」 はナシです

Bootstrap

次は Bootstrap 4.3.1 の js/src フォルダです

12 行ヒットしましたが for 文・コメント行・正規表現の中 と文頭 「;」 はなしです

まとめ

自分では思いつかないケースとかあるかなと思いましたが そういうはなく 代入時の左辺が複雑パターンか forEach メソッドだけでした
普段からこういう書き方を避けていれば完全にセミコロンレスな生活が送れますね!