JavaScript重箱の隅  新JavaScript入門  JavaScript,Neo-Generation  掲示板  表紙
2. for 
JavaScript 重箱の隅
Written 2/4/00
and と or
例えば次の式を考えます。
  A && B
 
AB は適当に自動変換されて truefalse のどちらかの値を取ることになります。 AB の取り得る値と式の値をまとめると次のようになります。
B
truefalse
Atruetruefalse
falsefalsefalse
ここで見てほしいのは Afalse のときです。 Btrue でも false でも 式の値は false になります。 つまり、 Afalse なら、 B がどの値を取ろうとどうでもよくなります。
そのため、JavaScript では Afalse なら B は評価されません。
  var a = 1;
  (a < 0) && (a = 2);   //最初の項がfalseなので a = 2 は評価されない
  alert(a);             //1
 
第2項の a = 2 が評価されれば、alert で 2 が表示されるはずですが、第1項で a < 0 が false となるため、a は 1 のままになります。
いちおう、動作は JavaScript1.3、JScript1、JScript5 で確認しました。

これは言語によって違って、例えば VBScript は常に両方評価されます。

  Function test2()
    Dim b, c
    b = 1
    c = (b < 0) And func1(b)     '第2項も評価される
    alert(b)                     '2
  End Function

  Function func1(p)              '参照渡し
    p = p + 1                    'bをインクリメント
    func1 = (p < 0)
  End Function
 
Perl でよくやるんですが、 JavaScript でもこの性質を利用して次のような書き方ができます。
  var a = 6;
  a % 2 == 0 && alert(a + "は2で割り切れる");
  a % 3 == 0 && alert(a + "は3で割り切れる");
  a % 4 == 0 && alert(a + "は4で割り切れる");
 
要するに、if(...) って書く代わりに && を使うということです。 if を使うよりちょっとすっきりしていますか?
ただ、Perl ほどは柔軟に書けないようです。 例えば、
  a % 2 == 0 && break;
 
というようなのは構文エラーだそうです。 ステートメントは使えないみたいです。 残念ですね。
WSH では次のように書けます。
  //3まで数える
  a = 1;
  while(true) {
    a > 3 && WScript.Quit();
    WScript.Echo(a++);
  }
 
or でも同じようなことがいえます。 上で示した演算表は次のようになります。
B
truefalse
Atruetruetrue
falsetruefalse
つまり、次の式を考えると、
  A || B
 
Atrue の場合、 どちらにしても 式の値は true になるため、 B は評価されません。
  var a = 6;
  a % 2 == 0 || alert(a + "は2で割り切れない");
  a % 3 == 0 || alert(a + "は3で割り切れない");
  a % 4 == 0 || alert(a + "は4で割り切れない");
 
first, next, exit