JavaScript | 論理演算子

JavaScript JavaScript
スポンサーリンク

論理演算子をプログラミング初心者向けにやさしく、例題つきで詳しく説明

短く言うと:論理演算子は「条件を組み合わせる」ための道具です。
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) とみなされる代表値:

  • false
  • 0
  • ""(空文字)
  • null
  • undefined
  • NaN

それ以外は 真(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)もあり、nullundefined のみを扱いたい場合は ?? を使う方が安全です(空文字 ""0 を有効な値にしたいときなど)。


4. !(否定)と !!(真偽値に変換する小ワザ)

  • !value は value の真偽を反転します(必ず true または false を返す)。
  • !!value を使うと値を強制的に boolean に変換できます(真なら true、偽なら false)。
console.log( !0 );       // true  (0 は falsy、!0 は true)
console.log( !!"hello" );// true  ("hello" は truthy)
JavaScript

5. 優先順位と括弧

  • !&&|| より優先して評価されます。意味を明確にしたいときは括弧を使う

誤りやすい例:

// 意図: x が 80 より大きくない(x <= 80)
!x > 80   // 書き方として誤解を招く。まず !x が計算される → 意図しない結果になる
JavaScript

正しい書き方:

!(x > 80)
JavaScript

基本ルール:複雑な条件では丸括弧 () を入れて読みやすく・安全に。


6. よくある落とし穴(初心者がはまりやすい)

  1. &&/|| の返り値が boolean 以外になることを知らない
    → 文字列や数値が返ってくるので、if には使えるが値を期待すると驚く。
  2. 空文字 ""0 を「有効な値」と扱いたい場合の誤用
    input || "default"input = 0"" のときも "default" に置き換わってしまう。そういうときは ?? を検討。
  3. 否定演算子の優先順位を誤解
    !x > 80 のような書き方は間違えやすい。括弧を使う。
  4. 副作用を持つ式を右側に置くと短絡評価で実行されない可能性
isReady && doSomething(); // isReady が false のとき doSomething() は呼ばれない
JavaScript

7. 具体的な例題(コードと挙動説明)

例題 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)) {
  // 処理
}
JavaScript

8. 練習問題(全 8 問) — 解答・詳解付き

問題 1
if (x > 0 && x < 10) は日本語で何を表す?
:x が 0 より大きく、かつ 10 より小さい(1〜9 の整数など)。

問題 2
console.log(0 || "hello") の出力は?
"hello"(左が falsy のため右を返す)

問題 3
console.log("hi" && 0) の出力は?
0(左が truthy のため右を返す。右が falsy)

問題 4
ユーザ入力 inputnull のときのみ "no input" を代わりに使いたい。let val = input || "no input"; は適切?
適切ではないinput""(空文字)や 0 の場合も "no input" に置き換わる。nullundefined のみを扱いたいなら let val = input ?? "no input"; を使う(?? は nullish coalescing)。

問題 5
if (!userIsAdmin && !userIsOwner) は何を意味?
:ユーザが管理者でも所有者でもない場合(どちらでもなければ)に処理する。

問題 6
a || bb || a は常に同じ結果?
:評価結果(最終的に返る値)の観点では 場合による。両方 truthy なら左側が返るため、ab のどちらを優先するかで異なる。真理値(boolean)だけを比べればどちらも「少なくとも一方が truthy か」を示すが、返す具体的な値は変わる。

問題 7
let ok = !!value; は何をしている?
value を boolean に変換して ok に入れている(真なら true、偽なら false)。

問題 8
次のコードの出力は?

let x = null;
console.log( x && (5 / 0) );
JavaScript

nullx が falsy(null)なので右側 (5 / 0) は評価されず、結果は null(右側の無限や例外は起きない)。


9. 覚えておくと便利なコーディングパターン

  • デフォルト値: let v = input || defaultVal;(ただし 0"" を有効値としたいなら ?? を検討)
  • ガード(安全チェック): user && user.name や(より安全に)user?.name(Optional chaining)
  • 真偽値変換: !!value

10. 初心者へのアドバイス

  1. &&|| は「真偽」だけでなく「値」を返すことがある —— console.log で実際に試して動きを確認しよう。
  2. 空文字 ""0 が falsy になる点で面食らうことが多い — ?? の存在も覚えると良い。
  3. 複雑な条件は括弧 () を使って読みやすく、安全に。
  4. 小さな例を作って console.log() で確かめるのが一番の理解法。
タイトルとURLをコピーしました