JavaScript:条件分岐(if / switch)
1学習の目的
- if / else if / else で処理を分岐させ、条件を厳しい順に並べられるようになる。ここから初めて「判断するプログラム」が書ける。
- switch で値による多分岐を書き分け、break の役割を理解する。会員ランク判定や入力チェックといった実務の判定ロジックを組み立てられるようになる。
2基礎解説
| やりたいこと | 書き方 | 意味 |
|---|---|---|
| 1つだけ判定 | if (条件) { } | 条件がtrueのときだけ実行 |
| 2つに分ける | if () { } else { } | どちらか一方だけ実行 |
| 3つ以上に分ける | else if | 上から順に、最初のtrueだけ |
| 値で振り分ける | switch (値) { case … } | 決まった値との照合向き |
- 条件は ( ) で囲み、処理は { } で囲む。1行でも { } を省略しないのが安全(後から行を足したときのバグを防ぐ)。
- else if は上から順に評価され、最初に true になった1つだけ実行される。だから条件は厳しい順に書く。
- switch の各 case には必ず break を書く。忘れると次の case まで続けて実行される(フォールスルー)。
- switch は === で比較する。case 1 と case "1" は別物として扱われる。
- 0・""・null・undefined は偽なので、if (!name) だけで「未入力」を判定できる。if (name === "") より簡潔で、null にも対応できる。
現場使用例:送料無料の判定 if (total >= 5000)、会員ランクの振り分け、フォームの入力チェック if (!name)、APIの応答コード分岐 switch (status)。
const score = 78;
let rank;
if (score >= 90) {
rank = "S";
} else if (score >= 75) {
rank = "A";
} else if (score >= 60) {
rank = "B";
} else {
rank = "C";
}
console.log(`${score}点 → ランク${rank}`); // 78点 → ランクA
// 値で振り分けるなら switch
const status = 404;
switch (status) {
case 200:
console.log("成功");
break;
case 404:
console.log("見つかりません");
break;
default:
console.log("その他のエラー");
}
3基本ドリル(10問)
出力 == 成人です
if (条件) { 処理 } の形。条件はカッコ、処理は波カッコで囲む。
const age = 20;
if (age >= 18) {
console.log("成人です");
}
if文の最小形。カッコと波カッコはセットで、Pythonのようなインデントによるブロック指定ではない点が違い。
A. エラーになる B. 次のcaseの処理まで続けて実行される C. 何も実行されない D. defaultが実行される 選択★☆☆無料
解答 == B
break は「そこで抜ける」という意味。
B
これをフォールスルーと呼ぶ。意図的に使うこともあるが、ほとんどは書き忘れによるバグ。case を書いたら break も書くと機械的に覚える。
出力 == 暑い
else { } を使う。else に条件は書かない。
const temp = 30;
if (temp > 25) {
console.log("暑い");
} else {
console.log("暑くない");
}
else は「残り全部」を受け止める。条件を書くとエラーになるので、条件付きで分けたいときは else if を使う。
const n = -5;
if (n > 0) {
console.log("正の数");
} ____ (n < 0) {
console.log("負の数");
} else {
console.log("ゼロ");
}
出力 == 負の数
「そうでなければ、もし〜」を表す2語。
else if
else if は何個でも並べられる。最後の else は条件不要で、すべてに当てはまらなかった場合を受け持つ。
A. A B. B C. 両方 D. どちらも実行されない 選択★☆☆無料
解答 == A
else if は上から順に見て、最初にtrueになった1つだけ。
A
95は最初の「60以上」で止まる。条件は厳しい順に書くのが鉄則で、この順番ミスは実務でも起きる典型バグ。
出力 == 送料:600円
let fee を用意して if/else で代入し、最後にまとめて出力する。
const price = 4800;
let fee;
if (price >= 5000) {
fee = 0;
} else {
fee = 600;
}
console.log(`送料:${fee}円`);
分岐で変数に入れて、最後にまとめて出力する形はconsole.logの重複を避けられて読みやすい。実務コードの定番パターン。
const status = 404;
switch (status) {
case 200:
console.log("成功");
break;
case 404:
console.log("見つかりません");
____;
default:
console.log("その他");
}
出力 == 見つかりません
case の処理を終えて switch から抜けるキーワード。
break
これが無いと default まで実行され、「見つかりません」と「その他」の両方が出力されてしまう。
A. 実行される B. 実行されない C. エラーになる D. 環境による 選択★★☆無料
解答 == B
switch はどの比較演算子で照合するか。
B
switch は === で厳密に比較する。数値の1と文字列の"1"は別物。JS03で学んだ === の性質がここでも効いてくる。
出力 == 名前を入力してください
空文字は偽なので、if (!userName) だけで判定できる。
const userName = "";
if (!userName) {
console.log("名前を入力してください");
}
!userName は「userNameが偽なら」という意味。空文字・null・undefined のすべてを1つの条件で拾えるので、入力チェックで多用する。
出力 == 春
case 3: case 4: case 5: と続けて書くと、3つとも同じ処理になる。
const month = 4;
switch (month) {
case 3:
case 4:
case 5:
console.log("春");
break;
default:
console.log("春以外");
}
case を並べると「または」の意味になる。break を書かない性質を意図的に利用した書き方で、これは正しい使い道。
4実践シナリオ(5問)
出力 == 年間87,000円 → シルバー会員
厳しい条件(10万以上)から先に書く。金額は toLocaleString() で3桁区切り。
const amount = 87000;
let rank;
if (amount >= 100000) {
rank = "ゴールド";
} else if (amount >= 50000) {
rank = "シルバー";
} else {
rank = "ブロンズ";
}
console.log(`年間${amount.toLocaleString()}円 → ${rank}会員`);
ランク判定はEC・CRMで必ず出てくる処理。条件の順番を逆にすると全員ブロンズになる典型バグに注意。
出力 == 名前を入力してください
else if でつなぐと1件だけ出る。空文字の判定は !userName、文字数は .length。
const userName = "";
const password = "abc123";
if (!userName) {
console.log("名前を入力してください");
} else if (password.length < 8) {
console.log("パスワードは8文字以上にしてください");
} else {
console.log("登録できます");
}
会員登録フォームのチェック処理そのもの。else if でつなぐと「最初のエラーだけ表示」、if を並べると「全エラー表示」になる。仕様に応じて使い分ける。
200→「成功しました」/400→「リクエストが不正です」/401・403→「アクセス権限がありません」/500→「サーバーエラーです」/その他→「不明なエラー(コード:403)」
「[403] アクセス権限がありません」の形式で1行出力すること。 コーディング★★☆無料
出力 == [403] アクセス権限がありません
401 と 403 は case を並べてまとめる。メッセージを変数に入れてから最後に出力すると1行で済む。
const status = 403;
let message;
switch (status) {
case 200:
message = "成功しました";
break;
case 400:
message = "リクエストが不正です";
break;
case 401:
case 403:
message = "アクセス権限がありません";
break;
case 500:
message = "サーバーエラーです";
break;
default:
message = `不明なエラー(コード:${status})`;
}
console.log(`[${status}] ${message}`);
値が決まっている多分岐は switch が読みやすい。if/else if で書くと status === 200、status === 400 …と毎回変数名を書く必要があり冗長になる。
出力 == 支払額:10,800円
「会員割引」「クーポン」「マイナス補正」は互いに独立した条件。else if ではなく if を3つ並べて上から順に価格を更新していく。
const price = 12000;
const isMember = true;
const hasCoupon = false;
let total = price;
if (isMember) {
total = Math.round(total * 0.9);
}
if (hasCoupon) {
total -= 500;
}
if (total < 0) {
total = 0;
}
console.log(`支払額:${total.toLocaleString()}円`);
else if と if の並列は意味が違うという最重要ポイント。「どれか1つ」なら else if、「全部それぞれ適用」なら if を並べる。ここを取り違えると割引が1つしか効かないバグになる。
ルール:4で割り切れる年はうるう年。ただし100で割り切れる年は平年。ただし400で割り切れる年はうるう年。 コーディング★★★無料
出力 == 2100年:平年
「例外の例外」があるので、400 → 100 → 4 の順に判定する。JS03の % と === を使う。
const year = 2100;
let isLeap;
if (year % 400 === 0) {
isLeap = true;
} else if (year % 100 === 0) {
isLeap = false;
} else if (year % 4 === 0) {
isLeap = true;
} else {
isLeap = false;
}
console.log(`${year}年:${isLeap ? "うるう年" : "平年"}`);
条件の順番がすべてを決める教科書的な問題。4から先に書くと2100年が誤判定される。実際にこのバグを埋め込んだシステム障害は何度も起きている。
5仕上げ課題
const weight = 4.2; // kg
const size = 95; // 3辺合計cm
const area = "関西";
const isMember = true;
料金ルール:
① サイズ100cm以下 かつ 重量5kg以下 → 基本900円・区分「通常サイズ」。それ以外 → 基本1400円・区分「大型サイズ」
② 地域加算(switch で書くこと):関東 +0円/関西 +200円/その他 +500円
③ 会員なら最後に合計から10%引き(Math.round で整数化)
出力仕様(4行):
=== 配送料金 ===
区分:通常サイズ(95cm / 4.2kg)
地域加算:関西 +200円
請求額:990円(会員割引あり)
出力4行が完全一致
①②③は独立した判定なので、if群を3つに分けて上から順に計算する。②は switch (area) で分岐し、加算額と表示を両方決める。最後の「会員割引あり/なし」は三項演算子で埋め込める。
const weight = 4.2;
const size = 95;
const area = "関西";
const isMember = true;
// ① サイズ区分と基本料金
let base;
let kind;
if (size <= 100 && weight <= 5) {
base = 900;
kind = "通常サイズ";
} else {
base = 1400;
kind = "大型サイズ";
}
// ② 地域加算
let extra;
switch (area) {
case "関東":
extra = 0;
break;
case "関西":
extra = 200;
break;
default:
extra = 500;
}
// ③ 会員割引
let total = base + extra;
if (isMember) {
total = Math.round(total * 0.9);
}
console.log("=== 配送料金 ===");
console.log(`区分:${kind}(${size}cm / ${weight}kg)`);
console.log(`地域加算:${area} +${extra}円`);
console.log(`請求額:${total.toLocaleString()}円(${isMember ? "会員割引あり" : "会員割引なし"})`);
実務の料金計算はほぼこの構造で書かれている。条件の塊ごとに分岐を分け、変数を上から積み上げる——この設計ができていれば、後から「離島は+800円」「学割を追加」といった仕様変更が来ても壊れずに拡張できる。
①は範囲の比較なので if、②は決まった値との照合なので switch——同じ「分岐」でも道具を使い分けているのがこの課題のポイント。地域が10種類に増えても switch なら case を足すだけで済む。
次章では繰り返しを学ぶ。1件の配送料しか計算できなかったこのコードが、100件のデータを一度に処理できるようになる。