JavaScriptのプログラムを記述する際、行末にセミコロン ; を付けるべきか、それとも省略すべきかという議論は、長年JavaScriptコミュニティの中で続いてきました。
JavaやC++などの言語を経験した開発者にとって、セミコロンは文の終わりを示す不可欠な存在ですが、現代のJavaScript開発においては、セミコロンを省略するスタイルも広く受け入れられています。
しかし、安易に「不要だから書かない」と決めてしまうと、JavaScript独自の仕様である自動セミコロン挿入 (ASI: Automatic Semicolon Insertion) の挙動によって、予期せぬバグを引き起こす可能性があります。
本記事では、セミコロン省略のメリットから、開発者が必ず知っておくべき「ハマりやすい罠」、そして現代の開発現場におけるベストプラクティスまでを詳しく解説します。
JavaScriptにおけるセミコロンの役割とASIの仕組み
JavaScriptにおいて、セミコロンは「文 (Statement)」の区切りを明示するための記号です。
しかし、JavaScriptエンジンには、セミコロンが記述されていない場合にプログラムの構造を解析し、必要に応じて自動的にセミコロンを補完する「ASI (Automatic Semicolon Insertion)」という仕組みが備わっています。
ASIが機能する基本的なルール
ASIは、以下のようないくつかの特定の状況下でトリガーされます。
- ソースコードを左から右へ解析した際、文法的に許容されないトークン
(Offending Token)に遭遇した場合。 - プログラムの終端に達した場合。
return、break、continue、throwなどの特定のキーワードの直後に改行があった場合。
例えば、以下のコードを見てみましょう。
// セミコロンを省略したコード
const message = "Hello"
console.log(message)
このコードを実行すると、JavaScriptエンジンは次のように解釈します。
// エンジン内部での解釈イメージ
const message = "Hello";
console.log(message);
このように、ほとんどのケースでは開発者がセミコロンを意識しなくても、ASIのおかげでプログラムは意図通りに動作します。
この仕組みこそが、JavaScriptでセミコロンを省略できる根拠となっています。
セミコロンを省略するメリット
現代のJavaScript開発において、セミコロンをあえて記述しないスタイルを選択する開発者やプロジェクトが増えています。
その主な理由には、以下のようなメリットが挙げられます。
コードの視認性が向上する
セミコロンを省略することで、コード上の「ノイズ」が減り、プログラムの本質的なロジックが際立つようになります。 特にモダンなフレームワーク(ReactやVue.jsなど)を用いた宣言的な記述においては、末尾のセミコロンがない方がすっきりとした印象を与えます。
タイピング量とメンテナンスの微減
一箇所一箇所はわずかな差ですが、プロジェクト全体で見ればセミコロンを打つ回数は膨大になります。
また、コピペなどでコードを移動させる際にも、行末の記号を気にせずに済むため、記述のスピードがわずかに向上します。
モダンな言語トレンドとの一致
Python、Swift、Kotlin、Goといった近年人気の高いプログラミング言語の多くは、行末のセミコロンを必須としていません。
JavaScriptでもセミコロンを省略することで、他言語とのスイッチングコストを下げ、現代的なコーディングスタイルに統一できるという側面があります。
セミコロン省略時にハマりやすい「死に至る罠」
セミコロンの省略にはメリットがある一方で、ASIの挙動を正しく理解していないと、デバッグが困難なバグを引き起こす「罠」がいくつか存在します。 ここでは、代表的な4つのパターンを紹介します。
1. return文の直後の改行
最も有名な罠が、return キーワードの直後に改行を入れてしまうケースです。
// 意図:オブジェクトを返したい
function getUser() {
return
{
name: "Taro"
}
}
const user = getUser()
console.log(user)
undefined
なぜ undefined になるのでしょうか。
それは、ASIが return の直後にセミコロンを挿入してしまうからです。
エンジンは以下のように解釈しています。
function getUser() {
return; // ここで文が終わってしまう!
{
name: "Taro"
};
}
この問題を回避するには、開始中括弧 { を return と同じ行に置く必要があります。
2. 行頭が [ (配列リテラル)で始まる場合
新しい行が [ で始まる場合、JavaScriptエンジンはそれを前の行の続き(プロパティアクセスやインデックス参照)として解釈しようとします。
const name = "JavaScript"
[1, 2, 3].forEach(num => console.log(num))
TypeError: Cannot read properties of undefined (reading 'forEach')
// もしくは実行環境により挙動が変わりますが、エラーになります
エンジンはこれを const name = "JavaScript"[1, 2, 3].forEach(...) と解釈しようとします。
文字列 "JavaScript" のインデックス [1, 2, 3] を参照しようとして失敗するのです。
3. 行頭が ( (即時関数など)で始まる場合
同様に、新しい行が ( で始まる場合も、前の行の関数呼び出しとして解釈されます。
const greeting = "Hello"
(() => {
console.log("I am an IIFE")
})()
TypeError: "Hello" is not a function
エンジンは const greeting = "Hello"(() => { ... })() と解釈し、文字列 "Hello" を関数として実行しようとするため、エラーが発生します。
4. 行頭が / (正規表現リテラル)で始まる場合
滅多にありませんが、行頭に正規表現を記述する場合も注意が必要です。
const x = y
/abc/g.test(str)
これは x = y / abc / g.test(str) という、除算演算子を含む一つの式として解釈される可能性があります。
セミコロン省略派が守るべきルール
もしあなたがセミコロンを省略するスタイル(Standardスタイルなど)を採用する場合、前述した罠を回避するために、「行頭が (, [, `, /, +, - で始まる場合は、その直前にセミコロンを置く」という防衛策を講じる必要があります。
// セミコロン省略派の安全な書き方
const name = "JavaScript"
;[1, 2, 3].forEach(num => console.log(num)) // 行頭にセミコロンを付ける
このように、行頭にセミコロンを配置することで、ASIによる誤った結合を明示的に防ぐことができます。
しかし、これを手動で行うのは効率的ではありません。
2026年における開発標準:ツールの活用
2026年現在の開発現場において、セミコロンの有無を人間が手動で管理することは稀です。
ESLintやPrettierといったフォーマッタ・リンターの活用が前提となっています。
Prettierによる自動解決
Prettierなどのコードフォーマッタを使用すれば、プロジェクトの設定ファイル (.prettierrc) でセミコロンの有無を定義するだけで、保存時に自動的に統一してくれます。
| 設定項目 | 内容 |
|---|---|
semi: true | すべての文末にセミコロンを付与する(推奨・保守的) |
semi: false | 必要な場所以外はセミコロンを省略する |
ESLintによるエラー検知
ESLintを導入していれば、ASIの罠にかかる可能性のあるコードを事前に検知し、警告を出してくれます。
例えば、前述の return 文の後の改行などは、no-unreachable ルールによってエラーとして指摘されます。
セミコロン「必須派」 vs 「省略派」:どちらを選ぶべきか?
どちらのスタイルを選ぶべきかは、最終的にはチームの合意とプロジェクトの性質によります。
判断の指標を整理しました。
セミコロンを「付ける」べきケース
- 安全性を最優先したい: ASIの仕様をチーム全員が熟知しているとは限らない場合、常に付ける方が安全です。
- レガシーなプロジェクト: 既存のコードがセミコロンありで書かれている場合、一貫性を保つために維持すべきです。
- 教育的な観点: 初心者が多いプロジェクトでは、文の終わりを意識させるために付けるルールにすることが多いです。
セミコロンを「省略する」べきケース
- モダンな開発体験を重視したい: TypeScriptやモダンなツールチェーンが整っており、自動整形が保証されている場合。
- コードの簡潔さを追求したい: ミニマリズムを好む開発文化がある場合。
- 特定のスタイルガイドに従う: StandardJSなどの「セミコロンなし」を標準とするガイドラインを採用する場合。
まとめ
JavaScriptにおけるセミコロンは、技術的には「ほとんどの場合で省略可能」ですが、その裏側にあるASI(自動セミコロン挿入)の挙動を理解しておくことはプロのエンジニアとして必須の知識です。
セミコロンを省略することでコードは美しく、簡潔になりますが、return 文の改行や、行頭の ( [ といった特定のパターンで意図しない動作を引き起こすリスクがあることを忘れてはいけません。
結論として、2026年のJavaScript開発においては、以下の3点を守ることを推奨します。
- プロジェクト開始時にチームでルールを統一する。
- Prettierなどのフォーマッタを導入し、個人の好みに依存しない自動成形を行う。
- ASIの仕組みを正しく理解し、万が一の挙動不審に備える。
セミコロンを付けるか付けないかは、もはや宗教論争ではなく、「どのようにしてコードの品質と一貫性を担保するか」というエンジニアリングの選択の問題です。
プロジェクトに最適なルールを選択し、快適なコーディング環境を構築しましょう。
