条件分岐
条件の真偽に応じて実行する処理を切り替える制御構造
条件分岐とは
条件分岐 (Conditional Branch) は、条件の真偽に応じて実行する処理を切り替える制御構造である。「もし〜なら A を実行し、そうでなければ B を実行する」というロジックの基本を担う。
if 文
最も基本的な条件分岐は if 文である。
const age = 18;
if (age >= 18) {
console.log("成人です");
} else {
console.log("未成年です");
}
else if による多分岐
条件が 3 つ以上ある場合は else if を使う。
const score = 75;
if (score >= 90) {
console.log("A");
} else if (score >= 70) {
console.log("B");
} else if (score >= 50) {
console.log("C");
} else {
console.log("D");
}
else if が 4 つ以上連なる場合は、switch 文やオブジェクトマッピングへの置き換えを検討する。
switch 文
特定の値に対する分岐には switch が適する。
const command = "start";
switch (command) {
case "start":
initialize();
break;
case "stop":
shutdown();
break;
case "restart":
shutdown();
initialize();
break;
default:
console.error(`不明なコマンド: ${command}`);
}
break を忘れるとフォールスルー (次の case も実行) が起きるため注意する。
三項演算子
単純な条件分岐は三項演算子で 1 行に書ける。
const status = age >= 18 ? "成人" : "未成年";
ネストした三項演算子は可読性が下がるため避ける。
早期リターン (ガード節)
条件分岐のネストが深くなる場合は、早期リターンで平坦にする。
// ❌ ネストが深い
function process(user: User | null) {
if (user !== null) {
if (user.isActive) {
if (user.hasPermission) {
return doWork(user);
}
}
}
return null;
}
// ✅ 早期リターンで平坦
function process(user: User | null) {
if (user === null) return null;
if (!user.isActive) return null;
if (!user.hasPermission) return null;
return doWork(user);
}
オブジェクトマッピング
文字列による分岐はオブジェクトで置き換えると拡張しやすい。
const handlers: Record<string, () => void> = {
start: () => initialize(),
stop: () => shutdown(),
restart: () => { shutdown(); initialize(); },
};
const handler = handlers[command];
if (handler) {
handler();
} else {
console.error(`不明なコマンド: ${command}`);
}
真偽値の判定
JavaScript / TypeScript では、以下の値が偽 (falsy) として扱われる。
| 値 | 型 |
|---|---|
false |
boolean |
0, -0 |
number |
"" |
string |
null |
null |
undefined |
undefined |
NaN |
number |
これら以外はすべて真 (truthy) である。空の配列 [] や空のオブジェクト {} は truthy であることに注意する。
よくある間違い
| 間違い | 問題 | 対策 |
|---|---|---|
= と === の混同 |
代入と比較を間違える | 常に === を使う |
| else if の連鎖が長い | 可読性の低下 | switch やマッピングに置換 |
| 三項演算子のネスト | 読めない | if 文に展開する |
| falsy の罠 | 0 や "" が偽になる |
明示的に比較する |
条件分岐の設計パターンは関連書籍に詳しい。
この記事は役に立ちましたか?
関連用語
パターンマッチ
値の構造に基づいて分岐処理を行う制御構文で、switch 文の強化版
ガード節
関数の先頭で異常条件を早期にチェックし、ネストを浅く保つプログラミングパターン
型の絞り込み
TypeScript の型ガードや制御フロー分析で、ユニオン型をより具体的な型に絞り込む手法
エンティティと値オブジェクト
DDD における 2 つの基本的なドメインモデル要素 - 同一性で区別するエンティティと、値で区別する値オブジェクト
Builder パターン
複雑なオブジェクトの生成をメソッドチェーンで段階的に構築するデザインパターン
Flyweight パターン
多数のオブジェクト間で共有可能な状態を分離し、メモリ使用量を削減するデザインパターン