例えば次の式を考えます。
A && B
A と
B は適当に自動変換されて
true
か
false のどちらかの値を取ることになります。
A と
B の取り得る値と式の値をまとめると次のようになります。
ここで見てほしいのは
A が
false のときです。
B が
true でも
false でも
式の値は
false になります。
つまり、
A が
false なら、
B がどの値を取ろうとどうでもよくなります。
そのため、JavaScript では
A が
false なら
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 でも同じようなことがいえます。
上で示した演算表は次のようになります。
つまり、次の式を考えると、
A || B
A が
true の場合、
どちらにしても 式の値は
true になるため、
B は評価されません。
var a = 6;
a % 2 == 0 || alert(a + "は2で割り切れない");
a % 3 == 0 || alert(a + "は3で割り切れない");
a % 4 == 0 || alert(a + "は4で割り切れない");