論理結合演算子

書式

式1 &  式2
式1 && 式2
式1 |  式2
式1 || 式2

&と|は短絡評価を行いません。

&&と||は短絡評価を行います。

解説

論理結合演算子は式1と式2をブール値として評価し、結果を論理的AND(演算子 &または&&)及び論理的OR(演算子 |または||)によって評価します。


論理的ANDは左辺式と右辺式を評価して共にtrueである場合のみtrueを返します。

論理的ORは左辺式と右辺式を評価してどちらか一方がtrueであればtrueを返します。それ以外の場合は共にfalseを返します。


短絡評価

&または|演算子は、左辺式と右辺式を両方評価してから、論理的ANDまたは論理的ORを行います。


&&演算子は左辺式がfalse値であった場合、右辺式を評価せずにfalseを返します。

左辺式がtrueであった場合、右辺式を評価した値をtrueまたはfalseで返します。

||演算子は左辺式がtrue値であった場合、右辺式を評価せずにtrueを返します。

左辺式がfalseであった場合、右辺式を評価した値をtrueまたはfalseで返します。


この&&または||演算子の振る舞いを短絡評価といいます。

短絡評価を用いることで右辺値の評価を抑制することができ、高速でシンプルなコードを記述することが出来ます。

(1 == 1) & (2 < 3)  trueと評価
(1 == 1) & (2 > 3)  falseと評価
(1 == 1) | (2 > 3)  trueと評価

var a = null;
if(a instanceof Number & a.toString() == "123") {
    # 左辺値に寄らず右辺値を評価してしまうため、右辺値の評価時にnull参照に対するメソッド呼び出し例外が発生してしまう。
    # 安全なコードにするためには、if文を2つに分け入れ子にするか、下記の短絡評価の構文を使用する必要がある。
}
if(a instanceof Number && a.toString() == "123") {
    # aがnullのため、右辺式は評価されず、例外は発生しない
}