JavaScript の switch 文
1. switch による制御フロー
switch 文は、特定の式を評価し、その結果に一致するラベル(case)に紐づいたコードブロックを実行します。
多くの if...else if...else ステートメントが連なるような、複数の候補値が存在するケースにおいて、より可読性の高い代替案として頻繁に利用されます。
1.1 構文(Syntax)
switch(式) {
case x:
// コードブロック
break;
case y:
// コードブロック
break;
default:
// コードブロック
}1.2 動作の仕組み
switch内の式が一度だけ評価されます。- 式の結果と各
caseの値が比較されます。 - 値が一致(マッチ)した場合、関連付けられたコードブロックが実行されます。
- 一致するものが存在しない場合、コードは実行されません(
defaultがない場合)。
2. 曜日判定のコード例
以下の例では、現在の曜日に対応する数値を取得し、その曜日の名前を算出しています。
switch (new Date().getDay()) {
case 0:
day = "日曜日";
break;
case 1:
day = "月曜日";
break;
case 2:
day = "火曜日";
break;
case 3:
day = "水曜日";
break;
case 4:
day = "木曜日";
break;
case 5:
day = "金曜日";
break;
case 6:
day = "土曜日";
}※ getDay() メソッドは、曜日を 0 から 6 の数値で返します(日曜日 = 0, 月曜日 = 1, ...)。
3. break キーワード
JavaScript が break キーワードに到達すると、switch ブロックから**脱出(ブレイク)**します。
これにより、ブロック内部の実行が停止され、それ以降のステートメントは実行されません。
- 最後の
caseについては、そこでブロックが終了するため、breakを記述する必要はありません。 breakは「フォールスルー(Fall-through)」を防ぐために極めて重要です。breakを忘れると、値が一致していなくても次のcaseやdefaultのブロックまで連続して実行されてしまいます。
4. default キーワード
default キーワードは、どの case にも一致しなかった場合に実行されるコードブロックを指定します。
これはオプション(任意)ですが、予期せぬ値に対するフォールバックとして役立ちます。
4.1 default の使用例
getDay() が土曜日(6)でも日曜日(0)でもない場合、デフォルトのメッセージを表示します。
switch (new Date().getDay()) {
case 6:
text = "今日は土曜日です";
break;
case 0:
text = "今日は日曜日です";
break;
default:
text = "週末を楽しみにしています";
}4.2 配置の柔軟性
default は必ずしもブロックの最後に置く必要はありません。
switch (new Date().getDay()) {
default:
text = "週末を楽しみにしています";
break;
case 6:
text = "今日は土曜日です";
break;
case 0:
text = "今日は日曜日です";
}※ default が最後ではない場合、処理を止めるために break で終了させるのを忘れないでください。
5. 共通のコードブロック
複数の case で同じ処理を共有させたい場合は、以下のように記述します。
switch (new Date().getDay()) {
case 4:
case 5:
text = "もうすぐ週末です";
break;
case 0:
case 6:
text = "週末です";
break;
default:
text = "週末を楽しみにしています";
}6. 動作の重要ルール
- 複数の
caseが値に一致する場合、最初に一致したものが選択されます。 - 一致する
caseが見つからない場合、プログラムはdefaultラベルへと進みます。 defaultラベルも見つからない場合、プログラムはswitchブロックの後にあるステートメントから続行されます。
7. 厳密な比較(Strict Comparison)
switch 文では、比較に厳密等価演算(===)が使用されます。
つまり、値が一致するだけでなく、データ型も同じである必要があります。
以下の例では、変数 x が文字列であるため、数値の case には一致しません。
let x = "0";
switch (x) {
case 0:
text = "オフ";
break;
case 1:
text = "オン";
break;
default:
text = "値が見つかりません";
}
// 結果: "値が見つかりません"