概要

論理演算子 (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 と評価されるものです。

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

ショートサーキット評価

論理演算子は左から右へ評価されるため、論理演算子で左辺を評価した時点で論理式の結果が確定した場合には右辺の評価を行わないことを、ショートサーキット評価といいます。例えば、A && Bという論理式があった場合、Aがfalseなら、その時点で式全体の結果はfalseで確定するため、Bがどうであるかについてはチェックしません。:

  • 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 Latest Draft (ECMA-262) ドラフト 仕様書内のいくつかのセクションで定義: Logical NOT Operator, Binary Logical Operators

ブラウザ実装状況

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!

機能 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 (!) (有) (有) (有) (有) (有) (有)

関連情報

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

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