JavaScript 速習チュートリアル

JavaScript の switch 文

1. switch による制御フロー

switch 文は、特定の式を評価し、その結果に一致するラベル(case)に紐づいたコードブロックを実行します。
多くの if...else if...else ステートメントが連なるような、複数の候補値が存在するケースにおいて、より可読性の高い代替案として頻繁に利用されます。

1.1 構文(Syntax)

switch(式) {
  case x:
    // コードブロック
    break;
  case y:
    // コードブロック
    break;
  default:
    // コードブロック
}

1.2 動作の仕組み

  1. switch 内の式が一度だけ評価されます。
  2. 式の結果と各 case の値が比較されます。
  3. 値が一致(マッチ)した場合、関連付けられたコードブロックが実行されます。
  4. 一致するものが存在しない場合、コードは実行されません(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 を忘れると、値が一致していなくても次の casedefault のブロックまで連続して実行されてしまいます。

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 = "値が見つかりません";
}
// 結果: "値が見つかりません"