switch 文版のステップ実行解説を 丁寧に/例を複数/落とし穴も含めて 作ります。
今回は次の流れで示します:
- 基本例:曜日(数値 → 曜日) — 普通の
switch(最も典型的) - 応用例:点数 → 評価(
switch(Math.floor(score/10))を使って範囲対応) - 落とし穴:
breakを忘れたときの fall-through(フォールスルー) の挙動と回避法 - 補足メモ:
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 の値 |
|---|---|---|---|---|---|---|---|
| 1 | let day = 3; | 3 | — | — | — | — | — |
| 2 | switch(day) 実行開始 | 3 | 式は 3 に評価 | case 0 | × | スキップ | “” |
| 3 | 次の case 評価 | 3 | — | case 1 | × | スキップ | “” |
| 4 | 次の case 評価 | 3 | — | case 2 | × | スキップ | “” |
| 5 | 次の case 評価 | 3 | — | case 3 | ✅ | name = "水曜日"; 実行、その後 break で switch 終了 | “水曜日” |
| 6 | console.log(name) 実行 | 3 | — | — | — | 出力: "水曜日" | “水曜日” |
解説ポイント
switchはswitch(式)の値と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
ステップ実行(逐次追跡)
| ステップ | 実行内容 | score | Math.floor(score/10) | 比較対象 | マッチ? | 実行処理 | grade |
|---|---|---|---|---|---|---|---|
| 1 | let score = 72; | 72 | — | — | — | — | “” |
| 2 | switch(Math.floor(score/10)) 開始 | 72 | 7 | case 10 | × | スキップ | “” |
| 3 | 次 case | 7 | — | case 9 | × | スキップ | “” |
| 4 | 次 case | 7 | — | case 8 | × | スキップ | “” |
| 5 | 次 case | 7 | — | case 7 | ✅ | grade = "C"; 実行 → break で抜ける | “C” |
| 6 | console.log(grade) → 出力 "C" | 72 | 7 | — | — | 出力 | “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
ステップ実行(逐次追跡)
| ステップ | 比較 | 実行 | 備考 |
|---|---|---|---|
| 1 | case 1 と一致 | console.log("one"); を実行 | break がない → 次の case へ継続 |
| 2 | 次 case 2 のブロックを実行 | console.log("two"); を実行、その後 break で switch 終了 | |
| 3 | default は実行されない | — | — |
解説ポイント
- 上のコードは
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.floorやswitch(true)などの工夫で可能だが、可読性と単純さを優先するならif/else ifの方が良い場合が多い。


