論理演算子 (Logical Operators)

真偽値とともに用いられた場合は真偽値を返しますが、そうではない場合には一方の演算対象を返すことがあります。

論理AND (&&)

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'

つまり、

  • 左辺がtrueか、trueに変換可能 → 右辺が返される。
  • 左辺がfalseか、trueに変換不可能 → 左辺が返される。

となっています。これはif文の評価と同じです。

3項以上ある場合

演算子の優先順位により、論理ANDと論理ORは「左から右」へと評価されます。

false && true || true     // true
false && ( true || true ) // false

論理OR (||)

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 …

を返します。これらをまとめると、結果は下表のように返されます。

左辺の評価 論理AND 論理OR
true 右辺 左辺
false 左辺 右辺

短絡評価 (ショートサーキット評価 : Short-Circuit Evaluation)

論理AND

論理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

論理ORでは、左辺がfalseと評価されるときのみ右辺が評価されます。これを利用すると、既定値の設定を簡潔に記述できます。

var a = null;
x = a || 10; // xは10となる
var a = 20;
x = a || 10; // xは20のまま
JavaScriptのドキュメントから検索