論理演算子をプログラミング初心者向けにやさしく、例題つきで詳しく説明
短く言うと:論理演算子は「条件を組み合わせる」ための道具です。
JavaScript の基本は &&(AND)、||(OR)、!(NOT)の3つ。ここでは「どう動くか」「よくある落とし穴」「実際のコード例」「練習問題(解答つき)」まで丁寧に見ていきます。
1. 基本ルール
a && b:両方とも真(true)のときだけ「真」。日本語だと「かつ」。a || b:どちらか一方でも真なら「真」。日本語だと「または」。!a:a を否定(真なら偽、偽なら真)。「〜ではない」。
例(自然言語)
age > 20 && age < 30→ 「年齢が 20 より大きく、かつ 30 より小さい」isAdmin || isOwner→ 「管理者か所有者のどちらかであればOK」!loggedIn→ 「ログインしていないなら」
2. JavaScript 特有の重要ポイント(truthy / falsy)
JavaScript では 値そのものが真/偽として評価されることがあります(真偽値 true/false だけではない)。
偽(falsy) とみなされる代表値:
false0""(空文字)nullundefinedNaN
それ以外は 真(truthy) とみなされます(例:"hello", 1, [], {} など)。
この性質が、論理演算子の「返り値」に影響します(次章)。
3. 短絡評価(短絡実行 / short-circuit)と返り値の挙動
&& と || は「必要がなければ右側を評価しない」仕組みです(短絡評価)。それだけでなく、評価結果として真偽値ではなく「もともとの値」を返す場合があります。
a && b:aが falsy →aをそのまま返す(bは評価されない)。aが truthy →bの評価結果(値)を返す。
a || b:aが truthy →aをそのまま返す(bは評価されない)。aが falsy →bの評価結果(値)を返す。
例を見てみよう:
console.log( null && (100 > 0) ); // 出力: null
console.log( 5 && "OK" ); // 出力: "OK" (5はtruthyなので右側を返す)
console.log( "" || "guest" ); // 出力: "guest"(左が空文字でfalsyのため右を返す)
console.log( "alice" || "guest" ); // 出力: "alice"(左がtruthyなので左を返す)
JavaScript実用テクニック:デフォルト値の代入
let name = inputName || "ゲスト";
// inputName が空文字や undefined なら "ゲスト" にする
JavaScript注意:ES2020 以降は ??(nullish coalescing)もあり、null や undefined のみを扱いたい場合は ?? を使う方が安全です(空文字 "" や 0 を有効な値にしたいときなど)。
4. !(否定)と !!(真偽値に変換する小ワザ)
!valueは value の真偽を反転します(必ずtrueまたはfalseを返す)。!!valueを使うと値を強制的に boolean に変換できます(真ならtrue、偽ならfalse)。
console.log( !0 ); // true (0 は falsy、!0 は true)
console.log( !!"hello" );// true ("hello" は truthy)
JavaScript5. 優先順位と括弧
!は&&や||より優先して評価されます。意味を明確にしたいときは括弧を使う。
誤りやすい例:
// 意図: x が 80 より大きくない(x <= 80)
!x > 80 // 書き方として誤解を招く。まず !x が計算される → 意図しない結果になる
JavaScript正しい書き方:
!(x > 80)
JavaScript基本ルール:複雑な条件では丸括弧 () を入れて読みやすく・安全に。
6. よくある落とし穴(初心者がはまりやすい)
&&/||の返り値が boolean 以外になることを知らない
→ 文字列や数値が返ってくるので、ifには使えるが値を期待すると驚く。- 空文字
""や0を「有効な値」と扱いたい場合の誤用
→input || "default"はinput = 0や""のときも"default"に置き換わってしまう。そういうときは??を検討。 - 否定演算子の優先順位を誤解
→!x > 80のような書き方は間違えやすい。括弧を使う。 - 副作用を持つ式を右側に置くと短絡評価で実行されない可能性
isReady && doSomething(); // isReady が false のとき doSomething() は呼ばれない
JavaScript7. 具体的な例題(コードと挙動説明)
例題 A — 年齢確認:
let age = 25;
if (age >= 18 && age < 65) {
console.log("働ける年齢帯です");
}
JavaScript→ age が 18 以上かつ 65 未満ならメッセージが出る(25 なので出る)。
例題 B — 入力の優先選択(デフォルト):
let name = "";
let defaultName = "ゲスト";
console.log( name || defaultName ); // "ゲスト"
JavaScript→ name が空文字(falsy)なので defaultName が出る。
例題 C — ガード句(処理を早めに終わらせる):
function printLength(str) {
if (!str) return; // str が falsy(null, undefined, "")なら終了
console.log(str.length);
}
JavaScript→ str がない(null/undefined/空)場合にそれ以上処理しない安全な書き方。
例題 D — 複雑条件は括弧で整理:
// 「Aが有効で、かつ (Bが有効またはCが有効)」という条件
if (A && (B || C)) {
// 処理
}
JavaScript8. 練習問題(全 8 問) — 解答・詳解付き
問題 1if (x > 0 && x < 10) は日本語で何を表す?
答:x が 0 より大きく、かつ 10 より小さい(1〜9 の整数など)。
問題 2console.log(0 || "hello") の出力は?
答:"hello"(左が falsy のため右を返す)
問題 3console.log("hi" && 0) の出力は?
答:0(左が truthy のため右を返す。右が falsy)
問題 4
ユーザ入力 input が null のときのみ "no input" を代わりに使いたい。let val = input || "no input"; は適切?
答:適切ではない。input が ""(空文字)や 0 の場合も "no input" に置き換わる。null と undefined のみを扱いたいなら let val = input ?? "no input"; を使う(?? は nullish coalescing)。
問題 5if (!userIsAdmin && !userIsOwner) は何を意味?
答:ユーザが管理者でも所有者でもない場合(どちらでもなければ)に処理する。
問題 6a || b と b || a は常に同じ結果?
答:評価結果(最終的に返る値)の観点では 場合による。両方 truthy なら左側が返るため、a と b のどちらを優先するかで異なる。真理値(boolean)だけを比べればどちらも「少なくとも一方が truthy か」を示すが、返す具体的な値は変わる。
問題 7let ok = !!value; は何をしている?
答:value を boolean に変換して ok に入れている(真なら true、偽なら false)。
問題 8
次のコードの出力は?
let x = null;
console.log( x && (5 / 0) );
JavaScript答:null。x が falsy(null)なので右側 (5 / 0) は評価されず、結果は null(右側の無限や例外は起きない)。
9. 覚えておくと便利なコーディングパターン
- デフォルト値:
let v = input || defaultVal;(ただし0や""を有効値としたいなら??を検討) - ガード(安全チェック):
user && user.nameや(より安全に)user?.name(Optional chaining) - 真偽値変換:
!!value
10. 初心者へのアドバイス
&&/||は「真偽」だけでなく「値」を返すことがある —— console.log で実際に試して動きを確認しよう。- 空文字
""や0が falsy になる点で面食らうことが多い —??の存在も覚えると良い。 - 複雑な条件は括弧
()を使って読みやすく、安全に。 - 小さな例を作って
console.log()で確かめるのが一番の理解法。
