JavaScript 入門

JavaScript 論理演算子

論理演算子を使用すると、複数のブーリアン(真偽値)式を組み合わせたり、修正したりすることができます。

これらはコード内で複雑な条件を作成するために不可欠であり、複数の要因に基づいて実行フローを制御することを可能にします。論理演算子を効果的に使いこなすことは、堅牢で柔軟なJavaScriptプログラムを書くための鍵となります。

本章では、&& (AND)、|| (OR)、および ! (NOT) 演算子について、それぞれの真理値表、実践的なコード例、そして一般的なユースケースを含めて包括的に解説します。

1. && (AND) 演算子の理解

&& 演算子は、論理積 (Logical AND) 演算子とも呼ばれます。

ルール: 両方のオペランド(被演算子)が true である場合にのみ true を返します。いずれか一方でも false であれば、式全体の評価結果は false となります。

1.1 && の真理値表

オペランド Aオペランド BA && B
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse

1.2 && のコード例

let age = 25;
let hasLicense = true; // 免許を持っているか

// 両方の条件を満たしている場合のみ、運転資格がある
if (age >= 16 && hasLicense) {
  console.log("あなたは運転する資格があります。");
} else {
  console.log("あなたは運転する資格がありません。");
}
// 出力: あなたは運転する資格があります。

この例では、&& 演算子が age が16以上であること、かつhasLicense 変数が true であることをチェックしています。両方の条件が満たされているため、if ブロック内のコードが実行されます。

let isLoggedIn = false; // ログインしているか
let isAdmin = false;    // 管理者権限があるか

if (isLoggedIn && isAdmin) {
  console.log("ようこそ、管理者様!");
} else {
  console.log("ようこそ!");
}
// 出力: ようこそ!

ここでは、たとえユーザーがログインしていたとしても、管理者ではありません。したがって、isLoggedIn && isAdmin 式の評価結果は false となり、「ようこそ!」というメッセージが表示されます。

1.3 && による短絡評価

JavaScriptは && 演算子に対して短絡評価(ショートサーキット評価)を行います。

これは、最初のオペランドが false の場合、2番目のオペランドは評価されないという仕組みです。なぜなら、2番目が何であれ、式全体の結果が false になることが既に確定しているからです。

let x = 5;
let y = 10;

// x > 10 は false なので、 y++ は実行されません
if (x > 10 && y++) {
   console.log("この行はプリントされません。");
}

console.log(y); // 出力: 10 (y はインクリメントされていない)

この例では、x > 10false であるため、y++ 式は一度も実行されません。これは、オブジェクトの存在を確認してからそのプロパティにアクセスする際のエラー防止や、不要な計算を避けることによるパフォーマンス向上に非常に役立ちます。

2. || (OR) 演算子の理解

|| 演算子は、論理和 (Logical OR) 演算子とも呼ばれます。

ルール: 少なくとも一方のオペランドが true であれば true を返します。両方のオペランドが false の場合にのみ false を返します。

2.1 || の真理値表

オペランド Aオペランド BA || B
truetruetrue
truefalsetrue
falsetruetrue
falsefalsefalse

2.2 || のコード例

let isWeekend = true;  // 週末である
let isHoliday = false; // 祝日である

// 週末、あるいは祝日であれば休むことができる
if (isWeekend || isHoliday) {
  console.log("休む時間です!");
} else {
  console.log("仕事に戻りましょう。");
}
// 出力: 休む時間です!

この例では、|| 演算子が isWeekend または isHoliday のいずれかであるかをチェックしています。isWeekendtrue であるため、式全体の評価結果は true となり、if ブロック内のコードが実行されます。

let temperature = 15; // 摂氏
let isRaining = true; // 雨が降っている

if (temperature < 0 || isRaining) {
  console.log("コートを着てください!");
} else {
  console.log("良い天気ですね!");
}
// 出力: コートを着てください!

ここでは、気温は0度を下回っていませんが、雨が降っています。したがって、temperature < 0 || isRaining 式の結果は true となり、「コートを着てください!」というメッセージが表示されます。

2.3 || による短絡評価

|| 演算子も短絡評価を行います。最初のオペランドが true であれば、2番目のオペランドは評価されません。なぜなら、2番目が何であれ、式全体の結果が true になることが既に確定しているからです。

let a = 5;
let b = 10;

// a < 10 は true なので、 b++ は実行されません
if (a < 10 || b++) {
   console.log("この行はプリントされます。");
}

console.log(b); // 出力: 10 (b はインクリメントされていない)

この例では、a < 10 が既に true であるため、b++ 式は実行されません。

3. ! (NOT) 演算子の理解

! 演算子は、論理否定 (Logical NOT) 演算子とも呼ばれます。

ルール: これは単項演算子(1つのオペランドのみに作用する)であり、その値を反転させます。オペランドが true であれば false を返し、その逆も同様です。

3.1 ! の真理値表

オペランド! オペランド
truefalse
falsetrue

3.2 ! のコード例

let isSunny = false; // 晴れである

// 晴れでないなら、傘が必要かもしれない
if (!isSunny) {
  console.log("傘を持って行ってください!");
} else {
  console.log("太陽を楽しみましょう!");
}
// 出力: 傘を持って行ってください!

この例では、! 演算子が isSunny の値(false)を反転させています。その結果、!isSunnytrue となり、if ブロックが実行されます。

let hasPermission = false; // 権限があるか

if (!hasPermission) {
  console.log("アクセスが拒否されました。");
} else {
  console.log("アクセスが許可されました。");
}
// 出力: アクセスが拒否されました。

ここでは、! 演算子がユーザーに権限がないことをチェックしています。hasPermissionfalse であるため、!hasPermissiontrue となります。

3.3 Truthy と Falsy に対する ! の使用

! 演算子は、Truthy(真値)Falsy(偽値) に対しても使用できます。データ型の章で触れた通り、JavaScriptでは明示的な true / false 以外もブーリアンコンテキストで判定されます。

let myString = ""; // 空文字列は Falsy

if (!myString) {
  console.log("文字列は空です。");
} else {
  console.log("文字列は空ではありません。");
}
// 出力: 文字列は空です。

この例では、空文字列 "" は Falsy な値です。したがって、!myString はそれを true に反転させ、if ブロックを実行します。

4. 論理演算子の組み合わせ

複数の論理演算子を組み合わせて、より複雑な条件を作成することができます。組み合わせる際は、優先順位を理解することが重要です。

  1. ! (最高優先順位)
  2. &&
  3. || (最低優先順位)

括弧 () を使用することで、デフォルトの優先順位を上書きし、コードの可読性を高めることができます。

4.1 論理演算子の組み合わせ例

let age = 30;
let hasLicense = true;
let isInsured = false; // 保険に入っているか

// レンタカーを借りるには、25歳以上、免許あり、かつ保険加入が必要
if (age >= 25 && hasLicense && isInsured) {
  console.log("車を借りることができます。");
} else {
  console.log("車を借りることはできません。");
}
// 出力: 車を借りることはできません。

この例では、3つの条件すべてが真である必要があります。isInsuredfalse であるため、式全体の結果は false となります。

let isStudent = true;       // 学生である
let isSeniorCitizen = false; // 高齢者である
let hasDiscountCode = true;  // 割引コードを持っている

// 学生、または高齢者、または割引コード保持者のいずれかであれば割引対象
if (isStudent || isSeniorCitizen || hasDiscountCode) {
  console.log("割引が適用されます!");
} else {
  console.log("割引はありません。");
}
// 出力: 割引が適用されます!

ここでは、いずれか1つの条件が真であれば割引が得られます。isStudenttrue であるため、式全体が true となります。

let isLoggedIn = true;
let isAdmin = false;
let isEditor = true;

// ログインしており、かつ(管理者または編集者)であれば高度な機能にアクセス可能
if (isLoggedIn && (isAdmin || isEditor)) {
  console.log("高度な機能へのアクセスが許可されました。");
} else {
  console.log("高度な機能へのアクセスが拒否されました。");
}
// 出力: 高度な機能へのアクセスが許可されました。

この例では、括弧によって || 演算子が && 演算子よりも先に評価されることが保証されています。ユーザーはログインしており、かつ(管理者または編集者のいずれか)であるため、高度な機能にアクセスできます。