論理積 (&&)

論理積 (&&) 演算子 (論理結合) を一組の論理型のオペランドに対して使用すると、すべてのオペランドが true である場合にのみ true になります。それ以外の場合は false になります。

一般的には、この演算子は左から右に向けて評価した際に最初の偽値のオペランドに遭遇したときにはその値を、またはすべてが真値であった場合は最後のオペランドの値を返します。

試してみましょう

構文

js
expr1 && expr2;

解説

論理積 (&&) はオペランドを左から右に向けて評価し、遭遇した最初の偽値のオペランドを直ちに返します。すべての値が真値であった場合、最後のオペランドの値が返されます。

ある値が true に変換できる場合、その値は真値 (truthy) と呼ばれます。ある値が false に変換できる場合、その値は偽値 (falsy) と呼ばれます。

false に変換することができる式の例を示します。

  • false
  • null
  • NaN
  • 0
  • 空文字列 ("" または '' または ``)
  • undefined

論理積演算子は次のように、論理型でない値はそのまま温存して返します。

js
result = "" && "foo"; // result には "" (空文字列) が代入される
result = 2 && 0; // result には 0 が代入される
result = "foo" && 4; // result には 4 が代入される

&& 演算子では論理値以外のオペランドを使用することができますが、返値が常に論理型プリミティブに変換することが可能であるため、論理演算子と見なすことができます。 返値(または一般的な式)を対応する論理値に明示的に変換するには、二重の否定演算子または Boolean コンストラクターを使用してください。

短絡評価

論理積の式は短絡演算子です。 各オペランドが論理値に変換されるとき、ある変換結果が false であった場合、論理積演算子は停止してその偽値のオペランドの元の値を返します。残りのオペランドは評価されません

以下の擬似コードを考えてみてください。

(偽値の式) && expr

expr の部分は評価されません。最初のオペランドである (偽値の式)偽値と評価されるからです。 expr が関数であった場合、その関数は呼び出されません。 以下の例を参照してください。

js
function A() {
  console.log("called A");
  return false;
}
function B() {
  console.log("called B");
  return true;
}

console.log(A() && B());
// 関数 A の呼び出しによって "called A" をログ出力し、
// && が false に評価され(関数 A が false を返し)、それから false をコンソールに出力します。
// 論理積演算子はここで短絡となり、関数 B は無視されます。

演算子の優先順位

AND 演算子は OR 演算子よりも高い優先順位を持つので、 && 演算子は || 演算子よりも先に実行されます(演算子の優先順位を参照)。

js
false || (true && true); // true を返す
true && (false || false); // false を返す
2 == 3 || (4 < 0 && 1 == 1); // false を返す

論理積の使用

以下のコードは && (論理積) 演算子の例を示しています。

js
a1 = true && true; // t && t は true を返す
a2 = true && false; // t && f は false を返す
a3 = false && true; // f && t は false を返す
a4 = false && 3 == 4; // f && f は false を返す
a5 = "Cat" && "Dog"; // t && t は "Dog" を返す
a6 = false && "Cat"; // f && t は false を返す
a7 = "Cat" && false; // t && f は false を返す
a8 = "" && false; // f && f は "" を返す
a9 = false && ""; // f && f は false を返す

論理型の変換規則

AND から OR への変換

論理型に関する以下の操作は、

js
bCondition1 && bCondition2;

常に以下のものと等しくなります。

js
!(!bCondition1 || !bCondition2);

OR から AND への変換

論理型に関する以下の操作は、

js
bCondition1 || bCondition2;

常に以下のものと等しくなります。

js
!(!bCondition1 && !bCondition2);

入れ子になった括弧の除去

論理式は左から右に評価されるので、いくつかのルールに従って複雑な式から括弧を削除することは常に可能です。

以下の論理型に関する複合操作は、

js
bCondition1 || (bCondition2 && bCondition3);

常に以下のものと等しくなります。

js
bCondition1 || (Condition2 && bCondition3;

仕様書

Specification
ECMAScript Language Specification
# prod-LogicalANDExpression

ブラウザーの互換性

BCD tables only load in the browser

関連情報