【ITニュース解説】Master the JavaScript Switch Statement: A Complete Guide with Examples & Best Practices
2025年09月17日に「Dev.to」が公開したITニュース「Master the JavaScript Switch Statement: A Complete Guide with Examples & Best Practices」について初心者にもわかりやすく解説しています。
ITニュース概要
JavaScriptの`switch`文は、長い`if...else if`文を避け、一つの値を複数のケースと比較し、処理を効率的に分岐させる制御構文だ。コードの可読性を高め、保守しやすくする。基本構文、`break`、`default`の活用法を習得し、クリーンなコードを書けるようになろう。
ITニュース解説
システムエンジニアを目指す初心者がJavaScriptでプログラムを書く際、条件によって処理を分けることは非常に頻繁に発生する。例えば、ユーザーの役割に応じて異なる処理を行う場合などが典型的だ。このような時、まず思いつくのはif...else if...else文を使う方法だろう。最初はシンプルなif文から始まり、条件が増えるごとにelse ifを追加していく。しかし、このelse ifが10個、15個と増えていくと、コードは非常に長く、読みにくく、どこで何が起きているのかを把握するのが難しくなる。このような状態では、プログラムの保守やデバッグも困難になり、効率的な開発が妨げられる。
このような複数の条件分岐を整理し、よりきれいで分かりやすいコードを書くために役立つのが、JavaScriptのswitch文である。if文がどんな状況にも対応できる万能なツールだとすれば、switch文は特定の、しかし非常に一般的な状況のために設計された専門的なツールと言える。それは、「一つの値」を「複数の候補となる値のリスト」と比較し、その値に応じた処理を実行するという状況である。
switch文の基本的な仕組みはこうだ。まず、与えられた「式」を一度だけ評価し、その結果得られた値と、switchブロック内に用意された複数のcase(ケース)の値を順に比較する。もし一致するcaseが見つかれば、そのcaseに対応する一連の処理が実行される。例えるなら、古い鉄道の操車場のようなものだ。一本の列車(式の結果)が到着し、その目的地(値)に応じて、適切な線路(case句)に切り替えられ、他の線路は無視される。
switch文の基本的な書き方は次のようになる。
1switch (式) { 2 case 値1: 3 // 式が値1と一致した場合に実行される処理 4 break; 5 case 値2: 6 // 式が値2と一致した場合に実行される処理 7 break; 8 case 値3: 9 // 式が値3と一致した場合に実行される処理 10 break; 11 default: 12 // どのcase値にも一致しない場合に実行される処理 13}
この構文の各部分を見ていこう。
まず、switch (式)の括弧の中に書かれる「式」は、switch文が評価する対象である。これは変数(例: userRole)、計算式(例: a + b)、あるいは関数呼び出しの結果(例: getUserStatus())など、何でも構わない。この式は一度だけ評価される。
次に、case 値:は、式の結果と比較される具体的な値を示す。switch文は、このcaseに指定された値と、switch (式)で評価された結果の値を、厳密な比較演算子である===(厳密等価演算子)を使って比較する。これは、値だけでなく、そのデータの型も完全に一致していなければ「一致」と判断されないことを意味する。例えば、数値の1と文字列の'1'は、caseの比較では一致しない。
break;は非常に重要なキーワードだ。これが登場すると、JavaScriptは現在のswitchブロックから直ちに抜け出す。もしbreakを書き忘れてしまうと、たとえ現在のcaseの処理が完了しても、プログラムはそのまま次のcase句の処理へと進んでしまう。これを「フォールスルー(fall-through)」と呼ぶ。ほとんどの場合、これは意図しないバグの原因となるため、各caseの処理の最後にbreakを記述することは必須だと考えてよい。
最後に、default:句は、どのcaseに指定された値とも式の結果が一致しなかった場合に実行される処理を指定する。これはif...else if...else文における最後のelse句に相当し、予期せぬ値が来た場合の安全策として機能するため、記述することを強く推奨する。default句は省略することも可能だが、プログラムの堅牢性を高めるためには含めるべきだ。
具体的な例でif...elseとswitchの違いを見てみよう。例えば、ユーザーの役割に応じて異なるアクセス権限を与える関数を考える。
if...elseを使った場合:
1function getAdminAccess(userRole) { 2 if (userRole === 'admin') { 3 console.log('フルアクセス許可'); 4 // 管理者ダッシュボードを表示する関数呼び出し 5 } else if (userRole === 'editor') { 6 console.log('部分アクセス許可'); 7 // 編集者パネルを表示する関数呼び出し 8 } else if (userRole === 'user') { 9 console.log('基本アクセス許可'); 10 // ユーザープロフィールを表示する関数呼び出し 11 } else { 12 console.log('アクセス拒否。無効な役割'); 13 // エラーページを表示する関数呼び出し 14 } 15}
同じ処理をswitch文で書くと、以下のようになる。
1function getAdminAccess(userRole) { 2 switch (userRole) { 3 case 'admin': 4 console.log('フルアクセス許可'); 5 // 管理者ダッシュボードを表示する関数呼び出し 6 break; 7 case 'editor': 8 console.log('部分アクセス許可'); 9 // 編集者パネルを表示する関数呼び出し 10 break; 11 case 'user': 12 console.log('基本アクセス許可'); 13 // ユーザープロフィールを表示する関数呼び出し 14 break; 15 default: 16 console.log('アクセス拒否。無効な役割'); 17 // エラーページを表示する関数呼び出し 18 } 19}
比較すると一目瞭然だ。switch文を使った方が、それぞれの役割(case)に対する処理が独立したブロックとして明確に区切られ、コードの意図が読み取りやすくなる。条件が増えても、コードが縦に長く伸びるだけで、分岐の構造が把握しやすい。
前述した「フォールスルー」について、もう一度掘り下げてみよう。break文の省略は、ほとんどの場合バグの原因となるが、意図的に利用することでコードを簡潔にできるケースもある。例えば、「月曜日と火曜日は午前中に会議がある」といった状況を考える場合、月曜日のcaseにbreakを記述せず、そのまま火曜日のcaseへとフォールスルーさせることで、両方で共通の会議処理を実行できる。
1let day = 'Monday'; 2 3switch (day) { 4 case 'Monday': 5 case 'Tuesday': // Mondayが一致した場合、ここにフォールスルー 6 console.log('午前中に会議があります。'); 7 // 会議に関する処理を呼び出す関数 8 break; // MondayとTuesdayの共通処理が終わったら抜ける 9 case 'Wednesday': 10 console.log('水曜日はミーティングです。'); 11 break; 12 default: 13 console.log('その他の日です。'); 14}
このように、複数のcaseで全く同じ処理を行いたい場合に、case句を連続して記述し、最後のcaseにのみbreakを置くことで、コードの重複を防ぎ、より簡潔に表現できる。ただし、意図的なフォールスルーを利用する場合は、後からコードを読んだ人が迷わないよう、コメントでその意図を明確に記述することが推奨される。
switch文のcase句で使用できる値についても補足が必要だ。caseの値は定数である必要がある。つまり、プログラムの実行中に値が変わる可能性がある変数(letで宣言されたものなど)をcase句に直接使うことはできない。しかし、constで宣言された定数や、単純な計算式の結果などはcaseの値として使用可能だ。
少し高度な使い方として、switch (true)というパターンがある。これは、if...else if文の長い連なりをswitch文で表現する際のテクニックだ。switch文の「式」の部分にtrueを指定することで、それぞれのcase句を実質的に条件式として扱うことができる。
1let score = 85; 2 3switch (true) { // ここで常にtrueを評価する 4 case (score >= 90): // この条件式がtrueになるかを評価 5 console.log('成績: A'); 6 break; 7 case (score >= 80): // この条件式がtrueになるかを評価 8 console.log('成績: B'); 9 break; 10 case (score >= 70): 11 console.log('成績: C'); 12 break; 13 default: 14 console.log('成績: F'); 15} 16// scoreが85なので、出力は「成績: B」となる。
この例では、switch (true)により、各case句の括弧内の式がそれぞれ評価され、最初にtrueになったcaseの処理が実行される。これは、特定の範囲の値をチェックするような場合に、if...else if文よりも構造的に読みやすく感じることもある。
switch文は、実際の開発現場で非常に多岐にわたる場面で活用されている。例えば、ユーザーが入力したコマンド(/help、/search、/quitなど)に応じて異なる機能を呼び出す「コマンド処理」や、ゲームの現在の状態(「ローディング中」、「メニュー画面」、「プレイ中」、「一時停止中」、「ゲームオーバー」など)を管理する「ステートマシン」の実装、Web APIからの応答として返されるHTTPステータスコード(200、400、401、404、500など)に応じてエラーメッセージや処理を振り分ける「APIレスポンス処理」、さらにはユーザーの設定や環境変数に基づいて機能の有効・無効を切り替える「機能フラグ」の実装など、多分岐処理が必要なあらゆる場所でその真価を発揮する。
switch文を効果的に、そしてプロフェッショナルに使うためには、いくつかのベストプラクティスがある。
まず、常にdefaultケースを含めることだ。たとえ全ての可能性を網羅していると考えていても、予期せぬ値が来た場合の安全策としてdefaultケースは非常に重要だ。例えば、defaultケースでエラーを発生させることで、予期せぬデータが渡されたことを早期に検知できる。
次に、breakを忘れないこと。意図的にフォールスルーを使わない限り、各caseの最後には必ずbreakを記述する。もし意図的にフォールスルーを使う場合は、その旨をコメントで明記し、他の開発者が混乱しないように配慮する。
そして、意図的なフォールスルーを使う場合は、複数のcase句をまとめることで、その意図が明確になり、可読性が向上する。
コードの整形(インデント)を統一することも重要だ。switch、case、default、そしてそれぞれの内部の処理が適切にインデントされていれば、コードの構造が一目で理解できる。
非常にシンプルなケースで、単に値を返すだけ、あるいは単一の関数を呼び出すだけであれば、JavaScriptの「オブジェクトリテラル(キーと値のペア)」を使ってswitch文を置き換えることも検討できる。これは、より簡潔に書ける場合があるが、複雑な処理やフォールスルーが必要な場合はswitch文の方が適している。
よくある疑問として、「常にif...elseの代わりにswitchを使うべきか?」というものがあるが、答えは「そうではない」だ。switch文は、「単一の値を、特定の、かつ定数的な複数の値と比較する」場合に特に適している。一方、if...elseは、「値の範囲をチェックする」(例: score > 90)、「複数の異なる条件を組み合わせる」(例: age > 18 && hasLicense)、あるいは**「値の真偽をチェックする」(例: if (myVar))**など、より柔軟な条件判断が必要な場合に使うべきである。どちらのツールも重要であり、状況に応じて適切に使い分けることが肝心だ。
また、switch文が厳密等価(===)を使うかどうかという質問もよくあるが、これは**「はい」**である。そのため、数値の1と文字列の'1'は異なるものとして扱われることを覚えておこう。
case句で変数を使えるかという疑問に対しては、constで宣言された定数は使用できるが、実行時に値が変わる可能性のあるletで宣言されたような「動的な変数」を直接case句に使うことはできない。caseの値はコンパイル時または実行前に評価される固定の値でなければならないためだ。
パフォーマンスについては、非常に多くのcaseがある場合、JavaScriptエンジンがswitch文を「ジャンプテーブル」のような効率的な構造に最適化する可能性があり、if...else ifチェーンよりも高速になることがある。しかし、ケースの数が少ない(2〜3個程度)場合は、パフォーマンス上の違いはほとんどなく、可読性を優先すべきである。パフォーマンス最適化は、実際にボトルネックとなっていることが確認されてから行うのが一般的なアプローチだ。
結論として、JavaScriptのswitch文は、コードを構造化し、読みやすく、そして効率的に多分岐処理を行うための強力な機能である。その基本的な構文、breakとフォールスルーの概念、そしてベストプラクティスを理解し、適切に活用することで、よりプロフェッショナルで保守しやすいコードを書くことができるようになるだろう。if文とswitch文は、それぞれ異なる得意分野を持つツールであり、どちらか一方だけを使うのではなく、それぞれの特性を理解し、状況に応じて最適なツールを選択する判断力を養うことが、システムエンジニアとしての成長には不可欠である。