概要
論理演算子 (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 (! ) |
(有) | (有) | (有) | (有) | (有) | (有) |