真偽値とともに用いられた場合は真偽値を返しますが、そうではない場合には一方の演算対象を返すことがあります。
true && true; // true false && false; // false false && true; // false true && false; // false false && 10; // false true && 10; // 10
10 && false; // false 10 && true; // true 10 && 20; // 20
1 && 'OK'; // 'OK' 0 && 'OK'; // 0 -1 && 'OK'; // 'OK' 'A' && 'OK'; // 'OK' '' && 'OK'; // '' null && 'OK'; // null [] && 'OK'; // 'OK'
つまり、
となっています。これはif文の評価と同じです。
演算子の優先順位により、論理ANDと論理ORは「左から右」へと評価されます。
false && true || true // true false && ( true || true ) // false
true || true; // true false || false; // false false || true; // true true || false; // true false || 10; // 10 true || 10; // true
10 || false; // 10 10 || true; // 10 10 || 20; // 10
論理ORは、論理ANDとは逆の結果を返します。つまり左辺をtrueと評価できるとき、それぞれ
を返します。これらをまとめると、結果は下表のように返されます。
左辺の評価 | 論理AND | 論理OR |
---|---|---|
true | 右辺 | 左辺 |
false | 左辺 | 右辺 |
論理ANDでは、左辺がfalseと評価されるとき右辺が評価されません。これを利用すると、オブジェクトが存在するときのみ、そのプロパティへアクセスする処理を簡潔に記述できます。
obj = { a: 1 }; x = obj && obj.a; // 右辺が呼び出され、ojb.aが返される obj = null; x = obj && obj.a; // 右辺は評価されず、objが返される x = obj.a; // 「TypeError: obj is null」となる
よって、
a && Func();
と記述することは、
if( a ) Func();
とすることと等価です。また、
a && b && Func();
は、
if( a && b ) Func();
と同じです。
論理ORでは、左辺がfalseと評価されるときのみ右辺が評価されます。これを利用すると、既定値の設定を簡潔に記述できます。
var a = null;
x = a || 10; // xは10となる
var a = 20;
x = a || 10; // xは20のまま