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

JavaScript
スポンサーリンク

switch文の落とし穴集(全5例)

switch 文はシンプルに見えて、実務や学習でよく起きる「罠(バグ)」が多い構文です。
ここでは、JavaScript の switch で初心者〜中級者が実際に陥りやすい「落とし穴」5選を、コード例+出力結果+原因+修正版で詳しく解説します。


⚠️ 落とし穴1:break を忘れてフォールスルーする

❌ NGコード

let color = "red";

switch (color) {
  case "red":
    console.log("赤です");
  case "blue":
    console.log("青です");
    break;
  default:
    console.log("不明な色です");
}
JavaScript

▶ 実行結果

赤です
青です

❗ 問題点

  • break を忘れたため、case "red" のあとに 次の case “blue” まで実行されてしまいました。
  • 意図せず複数の処理が走る → ロジックバグ。

✅ 修正版

switch (color) {
  case "red":
    console.log("赤です");
    break; // ← 忘れない!
  case "blue":
    console.log("青です");
    break;
  default:
    console.log("不明な色です");
}
JavaScript

⚠️ 落とし穴2:型が違うと一致しない(=== 比較)

❌ NGコード

let num = "1";

switch (num) {
  case 1:
    console.log("数値の1です");
    break;
  default:
    console.log("一致しません");
}
JavaScript

▶ 実行結果

一致しません

❗ 問題点

  • switch の比較は 厳密等価(===)
    "1"(文字列)と 1(数値)は違う型なので一致しません。

✅ 修正版

switch (Number(num)) {
  case 1:
    console.log("数値の1です");
    break;
  default:
    console.log("一致しません");
}
JavaScript

または、値の型をそろえる(比較する前に変換)こと。


⚠️ 落とし穴3:default がないため「何も起きない」

❌ NGコード

let fruit = "mango";

switch (fruit) {
  case "apple":
    console.log("りんごです");
    break;
  case "banana":
    console.log("バナナです");
    break;
}
JavaScript

▶ 実行結果

(何も出力されない)

❗ 問題点

  • fruit"mango" の場合、どの case にもマッチせず、
    default もないため何の処理も行われない

✅ 修正版

switch (fruit) {
  case "apple":
    console.log("りんごです");
    break;
  case "banana":
    console.log("バナナです");
    break;
  default:
    console.log("そのフルーツは対応していません");
}
JavaScript

⚠️ 落とし穴4:同じ値の case を重複させてしまう

❌ NGコード

let pet = "dog";

switch (pet) {
  case "dog":
    console.log("犬です");
    break;
  case "cat":
    console.log("猫です");
    break;
  case "dog": // ← 重複!
    console.log("もう一度犬です");
    break;
  default:
    console.log("不明");
}
JavaScript

▶ 実行結果

犬です

❗ 問題点

  • 同じ case ラベル(”dog”)が複数あっても、
    最初に出てきた方しか評価されません
    → 2つ目の "dog" は永遠に実行されません。

✅ 修正版

switch (pet) {
  case "dog":
    console.log("犬です(1回だけ)");
    break;
  case "cat":
    console.log("猫です");
    break;
  default:
    console.log("不明");
}
JavaScript

⚠️ 落とし穴5:範囲判定に switch をそのまま使おうとする

❌ NGコード

let score = 85;

switch (score) {
  case score >= 90:
    console.log("A");
    break;
  case score >= 70:
    console.log("B");
    break;
  default:
    console.log("C");
}
JavaScript

▶ 実行結果

C

❗ 問題点

  • case score >= 90 は「score >= 90 の結果(true/false)」を評価している。
  • switch(score) の値(85)と true/false は一致しない。
  • どの case にもマッチしないため、default が実行されてしまう。

✅ 修正版1(if/else if を使う)

if (score >= 90) {
  console.log("A");
} else if (score >= 70) {
  console.log("B");
} else {
  console.log("C");
}
JavaScript

✅ 修正版2(switch(true) テクニック)

switch (true) {
  case score >= 90:
    console.log("A");
    break;
  case score >= 70:
    console.log("B");
    break;
  default:
    console.log("C");
}
JavaScript

まとめ:switch の落とし穴対策リスト

落とし穴原因対策
① break忘れフォールスルー発生各case末尾にbreakを書く(意図的な連結は明示)
② 型不一致厳密比較(===)比較前に型変換/統一
③ defaultなしマッチしないと無出力必ずdefaultでフォールバック処理を書く
④ case重複最初のcaseのみ有効重複を避け、意図的にまとめる場合は fall-through を使う
⑤ 範囲判定caseに条件式は不適切if/elseまたはswitch(true)を使う

💡 実務的補足

  • 大規模ロジックでは、switch よりオブジェクトマップ {key: value} を使う方が安全で保守しやすいこともあります。
const colorMap = { red: "赤", blue: "青" };
console.log(colorMap[color] ?? "不明");
JavaScript
タイトルとURLをコピーしました