Join MDN and developers like you at Mozilla's View Source conference, 12-14 September in Berlin, Germany. Learn more at https://viewsourceconf.org

論理演算子

概要

論理演算子 (Logical operators) は、基本的に真偽(論理)値とともに用いられます。そのときは、真偽値を返します。しかし、&& および || 演算子は、実際には、指定された演算対象の一方を返します。ですから、それらの演算子が、真偽値ではない値とともに用いられた場合、真偽値ではない値を返す可能性があります。

説明

論理演算子を以下の表で説明します。:

演算子 使用法 説明
論理 AND(&&) expr1 && expr2 expr1 を false と見ることができる場合は、expr1 を返します。そうでない場合は、expr2 を返します。したがって、真偽値と共に使われた場合、 演算対象の両方が true ならば、&& は、true を返し、そうでなければ、false を返します。
論理 OR (||) expr1 || expr2 expr1 を true と見ることができる場合は、expr1 を返します。そうでない場合は、expr2 を返します。したがって、真偽値と共に使われた場合、 演算対象のどちらかが true ならば、|| は、true を返し、両方とも false の場合は、false を返します。
論理 NOT (!) !expr 単一の演算対象が true と見ることができる場合は、false を返します。そうでない場合は、true を返します。

true に変換できる値は、いわゆる truthy です。false に変換できる値は、いわゆる falsy です。

false と見ることができる式の例は、null、0、空文字列 ("")、あるいは、undefined と評価されるものです。

&&|| 演算子が真偽値ではない値である演算対象とともに用いることができても、それらは、真偽演算子と考えることができます。なぜなら、それらの戻り値は、常に、真偽値と見ることができるからです。

ショートサーキット評価

論理演算子は左から右へ評価されるため、以下の規則を用いることで「ショートサーキット」評価ができるようになっています。:

  • false && (anything) をショートサーキット評価すると、false になります。
  • true || (anything) をショートサーキット評価すると、true になります。

論理の規則はこれらの評価が常に正確であることを保証しています。上記の式の anything の部分は評価されないため、何らかの副作用が生じないように注意してください。また、上記の式の anything の部分は (括弧で示しているとおり) ひとつの論理式ですので注意してください。

例えば、以下の 2 つの関数は等価です。

function shortCircuitEvaluation() {
  doSomething() || doSomethingElse()
}

function equivalentEvaluation() {
  var flag = doSomething();
  if (!flag) {
    doSomethingElse();
  }
}

しかし、以下の式は等価ではありません。これは演算子の優先順位のためであり、右側の演算子をひとつの式にする (必要に応じて括弧でグループ化する) 必要性の重要度を高めています。

false && true  || true      // true を返す
false && (true || true)     // false を返す

論理 AND (&&)

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

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 を返します。

論理 OR (||)

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

o1 = true  || true       // t || t true を返します。
o2 = false || true       // f || t true を返します。
o3 = true  || false      // t || f true を返します。
o4 = false || (3 == 4)   // f || f false を返します。
o5 = "Cat" || "Dog"      // t || t "Cat" を返します。
o6 = false || "Cat"      // f || t "Cat" を返します。
o7 = "Cat" || false      // t || f "Cat" を返します。

論理 NOT (!)

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

n1 = !true              // !t false を返します。
n2 = !false             // !f true を返します。
n3 = !"Cat"             // !t false を返します。

変換規則

AND から OR への変換

Boolean について以下の演算を行います:

bCondition1 && bCondition2

これは以下の演算と等価です:

!(!bCondition1 || !bCondition2)

OR から AND への変換

Boolean について以下の演算を行います:

bCondition1 || bCondition2

これは以下の演算と等価です:

!(!bCondition1 && !bCondition2)

NOT 間の変換

Boolean について以下の演算を行います:

!!bCondition

これは以下の演算と等価です:

bCondition

入れ子の括弧を削除する

論理演算子は左から右へ評価されるため、複雑な式の中にある括弧をいくつかの規則に従って削除することができます。

入れ子の AND を削除する

Boolean について以下の複雑な演算を行います:

bCondition1 || (bCondition2 && bCondition3)

これは以下の演算と等価です:

bCondition1 || bCondition2 && bCondition3

入れ子の OR を削除する

Boolean について以下の複雑な演算を行います:

bCondition1 && (bCondition2 || bCondition3)

これは以下の演算と等価です:

!(!bCondition1 || !bCondition2 && !bCondition3)

仕様

仕様書 策定状況 コメント
ECMAScript 1st Edition (ECMA-262) 標準 最初期の定義
ECMAScript 5.1 (ECMA-262) 標準 仕様書内のいくつかのセクションで定義: Logical NOT Operator, Binary Logical Operators
ECMAScript 2015 (6th Edition, ECMA-262) 標準 仕様書内のいくつかのセクションで定義: Logical NOT Operator, Binary Logical Operators
ECMAScript 2017 Draft (ECMA-262) ドラフト 仕様書内のいくつかのセクションで定義: Logical NOT Operator, Binary Logical Operators

ブラウザ実装状況

機能 Chrome Firefox (Gecko) Internet Explorer Opera Safari
論理 AND (&&) (有) (有) (有) (有) (有)
論理 OR (||) (有) (有) (有) (有) (有)
論理 NOT (!) (有) (有) (有) (有) (有)
機能 Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
論理 AND (&&) (有) (有) (有) (有) (有) (有)
論理 OR (||) (有) (有) (有) (有) (有) (有)
論理 NOT (!) (有) (有) (有) (有) (有) (有)

関連情報

ドキュメントのタグと貢献者

 このページの貢献者: yyss, teoli, keiskimu, ethertank, Potappo
 最終更新者: yyss,