JavaScript | レベル別練習問題:条件分岐(if / else / switch)

JavaScript
スポンサーリンク

switch 文版のステップ実行解説を 丁寧に/例を複数/落とし穴も含めて 作ります。
今回は次の流れで示します:

  1. 基本例:曜日(数値 → 曜日) — 普通の switch(最も典型的)
  2. 応用例:点数 → 評価(switch(Math.floor(score/10)) を使って範囲対応)
  3. 落とし穴:break を忘れたときの fall-through(フォールスルー) の挙動と回避法
  4. 補足メモ:switch が使う比較方法やよくある使いどころ

1. 基本例:曜日(数値 → 曜日)

let day = 3; // 0 = 日曜日, 1 = 月曜日, ..., 6 = 土曜日
let name = "";

switch (day) {
  case 0:
    name = "日曜日";
    break;
  case 1:
    name = "月曜日";
    break;
  case 2:
    name = "火曜日";
    break;
  case 3:
    name = "水曜日";
    break;
  case 4:
    name = "木曜日";
    break;
  case 5:
    name = "金曜日";
    break;
  case 6:
    name = "土曜日";
    break;
  default:
    name = "不明";
}

console.log(name);
JavaScript

最終出力

水曜日

ステップ実行(逐次追跡)

ステップ実行内容day の値switch 式の評価比較対象(case)マッチ?実行された処理name の値
1let day = 3;3
2switch(day) 実行開始3式は 3 に評価case 0×スキップ“”
3次の case 評価3case 1×スキップ“”
4次の case 評価3case 2×スキップ“”
5次の case 評価3case 3name = "水曜日"; 実行、その後 break で switch 終了“水曜日”
6console.log(name) 実行3出力: "水曜日"“水曜日”

解説ポイント

  • switchswitch(式) の値と case ラベルの値を 厳密等価(===) で比較します。
  • case が一致したら、該当ブロックを実行。break があるとそこで switch を抜ける。break を忘れると次の case へ続けて実行されます(下で詳述)。

2. 応用例:点数 → 評価(範囲判定)

switch は単一値の比較に強いが、範囲判定も工夫すれば可能です。ここでは Math.floor(score / 10) を使って 90〜100→9/10 等を判定します。

let score = 72;
let grade = "";

switch (Math.floor(score / 10)) {
  case 10: // 100 点
  case 9:
    grade = "A";
    break;
  case 8:
    grade = "B";
    break;
  case 7:
    grade = "C";
    break;
  case 6:
    grade = "D";
    break;
  default:
    grade = "F";
}

console.log(grade);
JavaScript

最終出力

C

ステップ実行(逐次追跡)

ステップ実行内容scoreMath.floor(score/10)比較対象マッチ?実行処理grade
1let score = 72;72“”
2switch(Math.floor(score/10)) 開始727case 10×スキップ“”
3次 case7case 9×スキップ“”
4次 case7case 8×スキップ“”
5次 case7case 7grade = "C"; 実行 → break で抜ける“C”
6console.log(grade) → 出力 "C"727出力“C”

解説ポイント

  • case 10: case 9: のように 複数の case を並べて同じ処理にする(fall-through を意図的に使う)と、90〜100 を A にまとめられます。
  • Math.floor(score/10) のような変換を switch の式側で行う方法はよく使われます(範囲を整数バケットに落として比較)。

3. 落とし穴:break を忘れるとどうなる?(fall-through の例)

ブロックの最後に break を書き忘れると、その case の処理を実行したあと 次の case の処理も続けて実行されます(これをフォールスルーという)。意図的に使う場合もありますが、無意識だとバグになります。

let x = 1;
switch (x) {
  case 1:
    console.log("one");
  case 2:
    console.log("two");
    break;
  default:
    console.log("other");
}
JavaScript

実行結果(x = 1 の場合)

one
two

ステップ実行(逐次追跡)

ステップ比較実行備考
1case 1 と一致console.log("one"); を実行break がない → 次の case へ継続
2case 2 のブロックを実行console.log("two"); を実行、その後 breakswitch 終了
3default は実行されない

解説ポイント

  • 上のコードは x===1 のときに "one""two" が両方出るため、case ごとに break を忘れると意図しない複数出力になります。
  • 一方、複数の case をまとめたいとき(例:case 10: case 9: grade="A"; break;)は意図的に break を置かないテクニックを使います。

4. switch(true) を使った「範囲」判定(代替テクニック)

switch は式の評価値と case 値の厳密比較を行うため、switch(true) として case に条件式(ブール値)を書くことで if/else if と似た使い方ができます。ただし可読性は状況によります。

let score = 85;
let grade = "";

switch (true) {
  case score >= 90:
    grade = "A";
    break;
  case score >= 80:
    grade = "B";
    break;
  case score >= 70:
    grade = "C";
    break;
  default:
    grade = "F";
}

console.log(grade); // B
JavaScript

ポイント

  • switch(true)case に書いた条件式が true かどうかを順に評価する仕組みになる(最初に true になったブロックが実行される)。
  • 内部的には === 比較なので case (score >= 90)case true の意味になります。
  • 可読性やワークフローによって if/else if の方が適する場合もあるので使い所を考えてください。

補足メモ(実用上の注意点まとめ)

  • 比較は厳密比較(===)なので switch("1")case 1: は一致しません。型が違うとマッチしない点に注意。
  • break を忘れるとフォールスルーする(意図的に使うこともある)。
  • case ラベルにはリテラルや式(評価結果が値になるもの)を置ける(ただし case 内の式は値に評価されるまでの処理をよく考えること)。
  • 複数の値で同じ処理をする場合は case a: case b: ... の形が便利。
  • 範囲判定は Math.floorswitch(true) などの工夫で可能だが、可読性と単純さを優先するなら if/else if の方が良い場合が多い。
タイトルとURLをコピーしました