| この記事の要点 |
|
JavaScript の条件分岐の基本
// if / else
if (score >= 80) {
console.log("A");
} else if (score >= 60) {
console.log("B");
} else {
console.log("C");
}
// ブロックを省略すると 1 文だけが対象 (バグの温床)
if (cond) doA();
else doB();
// 必ず波括弧で書く方が安全
if (cond) {
doA();
} else {
doB();
}
truthy / falsy
JavaScript では条件式の値が真偽以外でも、truthy / falsy として評価されます。
| falsy な値 | truthy な値 |
|---|---|
false | 左以外すべて |
0 / -0 / 0n | 1, -1 |
"" (空文字) | "0", "false" (文字列) |
null | [] (空配列) |
undefined | {} (空オブジェクト) |
NaN | 関数 |
// 注意: 空配列・空オブジェクトは truthy
if ([]) console.log("truthy"); // 出力される!
if ({}) console.log("truthy"); // 同上
// 配列の中身を見るなら length
if (arr.length > 0) { ... }
// "0" は truthy だが Number("0") は 0 で falsy
if ("0") console.log("truthy"); // 出る
if (Number("0")) console.log("truthy"); // 出ない
三項演算子
// cond ? a : b
const label = (age >= 20) ? "成人" : "未成年";
// 入れ子 (読みづらいので 2 段以上は if に置き換える)
const grade = score >= 80 ? "A"
: score >= 60 ? "B"
: "C";
// React の条件レンダリング
return (
<div>
{isLoggedIn ? <Dashboard /> : <Login />}
</div>
);
switch / case
switch (status) {
case "active":
showActive();
break; // ← 必ず付ける
case "pending":
case "review": // fall-through で複数 case をまとめる
showWaiting();
break;
case "banned":
showBanned();
break;
default:
showUnknown();
}
// switch は === 比較 (型まで一致が必要)
switch (1) {
case "1": // ← マッチしない!
...
}
// パターンとして「式」を使うトリック (ES6)
switch (true) {
case score >= 80:
return "A";
case score >= 60:
return "B";
default:
return "C";
}
論理演算子 (&& / || / !)
// 短絡評価 (short-circuit)
const a = obj && obj.name; // obj が truthy なら obj.name、falsy ならその値
const b = name || "ゲスト"; // name が truthy なら name、falsy なら "ゲスト"
const c = !done; // 否定
// 副作用利用
isLoggedIn && console.log("welcome"); // true のときだけ実行
err || console.log("ok"); // err が falsy なら実行
Null 合体演算子 ?? (ES2020)
|| と似ていますが、null / undefined のときだけ代替値を使います。0 や 空文字 は通します。
const a = undefined ?? "default"; // "default"
const b = null ?? "default"; // "default"
const c = 0 ?? "default"; // 0 (?? は 0 を通す)
const d = "" ?? "default"; // "" (?? は "" を通す)
const e = "value" ?? "default"; // "value"
// 比較: || は 0 や "" も falsy 扱い
const f = 0 || "default"; // "default" ← 0 を捨てるので注意
const g = "" || "default"; // "default" ← 空文字を捨てる
// 推奨: 「未定義のとき」を表現したいなら ?? を使う
function greet(name) {
const display = name ?? "ゲスト"; // null/undefined だけデフォルト
return `こんにちは ${display}`;
}
Optional Chaining ?. (ES2020)
// 従来: ネストしたプロパティ参照は null チェック地獄
const city = user && user.address && user.address.city;
// ES2020: Optional Chaining
const city = user?.address?.city;
// メソッド呼び出し
const name = obj?.getName?.();
// 配列インデックス
const first = arr?.[0];
// 組み合わせ
const cityOrDefault = user?.address?.city ?? "東京";
論理代入演算子 (ES2021)
// ||= : 左が falsy のときだけ代入
let a = "";
a ||= "default"; // "default" (空文字は falsy)
// &&= : 左が truthy のときだけ代入
let b = "hello";
b &&= b.toUpperCase(); // "HELLO"
// ??= : 左が null/undefined のときだけ代入
let c = 0;
c ??= 100; // 0 (?? は 0 を通すので代入されない)
let d;
d ??= "default"; // "default"
// 実用: オブジェクトのデフォルト値設定
function init(opts = {}) {
opts.timeout ??= 30;
opts.retries ??= 3;
return opts;
}
等価比較 (== vs ===)
// == は型変換あり (推奨しない)
0 == "0" // true
0 == false // true
null == undefined // true
"" == false // true
// === は厳密比較 (型まで一致)
0 === "0" // false
0 === false // false
null === undefined // false
// 常に === を使うべき
if (status === "active") { ... }
// 唯一の例外: null/undefined を同時にチェックするとき
if (value == null) { ... } // null と undefined の両方をカバー
// または明示的に
if (value === null || value === undefined) { ... }
分岐パターンのベストプラクティス
| やりたいこと | 推奨 |
|---|---|
| 2 つの値からどちらか | 三項 ?: |
| 3 段以上の分岐 | if / else if |
| 1 つの変数を多くの値と比較 | switch または Map ルックアップ |
| null/undefined を代替値に | ?? |
| falsy 全般を代替値に | || |
| 深いプロパティアクセス | ?. |
| 条件付きで一度だけ代入 | ??= |
FAQ
Q: switch と if/else if、どちらが速い?
A: 現代の JS エンジンでは差はわずか。可読性で選ぶのが鉄則。多くの値と等価比較するなら switch、範囲比較や複雑な条件なら if。
Q: ?? と || の使い分けは?
A: 0 や 空文字を有効値として扱いたいなら必ず ??。|| は「未入力」を「空文字」と同一視して問題ないときに限定。
Q: TypeScript で if (x) はどう判定される?
A: 型ガードとして機能し、ブロック内では x が non-null と推論されます。Optional Chaining と組み合わせると安全に書けます。
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Git pushした変更の取消し|revert・履歴変更と保護の注意点 2026-10-15 23:49:01
- Gitでローカルを戻す前に|reset・restoreの違いと退避範囲 2026-10-15 23:49:01
- Git rebaseの使い方|対象範囲・競合解決・pushの判断 2026-10-15 22:50:59
- Git pullの使い方|取込み先・ff-only・競合とstashの注意点 2026-10-15 22:50:59
- Git pushの使い方|送信先・タグ・force-with-leaseの条件 2026-10-15 22:12:47
- Git remoteの設定・確認・削除|SSH URLとfetch/pushの違い 2026-10-15 22:12:47
- Gitリモートリポジトリの作成|初回push・既存履歴・mirrorの注意 2026-10-15 15:48:16
- Gitのuser.name・user.email設定|local/global・確認と過去履歴の注意 2026-10-15 15:30:07
- LinuxにGitをインストール|配布元・初期設定・TLSと認証の確認 2026-10-15 15:30:06
- Git導入と初回push|Linuxサーバー・Windows/macOS・SSH設定 2026-10-15 14:51:54
- Db2のCREATE INDEX|索引定義・INCLUDEと実行計画の確認 2026-10-15 14:10:22
- Db2の自動採番|IDENTITY・ID取得とRESTARTの注意点 2026-10-15 14:10:22
- 【DB2】特定スキーマの全テーブルの全カラム情報を取得する方法 2026-10-15 13:53:15
- Db2のシーケンスとIDENTITYの違い|採番とカタログの確認SQL 2026-10-15 13:53:15
- Db2で複数カラムをUPDATEする方法|SET・WHEREと更新前の値 2026-10-15 13:53:15