JavaScript Puzzlers

上に関連して、たまたま今日思いついたJavaScriptのパズルを一つ。

前提知識

JavaScriptではJavaと異なり、if文などの条件式にはboolean値に限らず、すべての式を与えることができます。

var array = [true, 1, 'abc', [], {}, false, null, undefined, 0, '', NaN];
for(var i=0;i<array.length;i++) {
  if(array[i]) alert(i);
}

このスクリプトを実行すると、配列に与えられた値のうち、trueから{}まではalert関数が呼び出されます。つまり条件式での真偽の判定は、以下のようになります。

条件式が真となる値
true, 0以外の数値, 空でない文字列, 配列, オブジェクト(連想配列)
条件式が偽となる値
false, null, undefined, 0, 空文字列, NaN

問題

では、以下のスクリプトを実行した結果を1から4の選択肢から予想してください。
なおalert関数は、通常のブラウザの実装通り、引数の文字列をダイアログで表示する関数であるとします。

function proveDoMorgan() {
  var a = true;
  var b = 2;
  if((a && b) == !(!a || !b)) {
    alert("Equal!");
  }
  else {
    alert("Not Equal!");
  }
}

proveDoMorgan();
  1. Equal! とダイアログで表示される。
  2. Not Equal! とダイアログで表示される。
  3. エラーが発生する。
  4. 上記以外


prototype.jsのソースを呼んだことのある人なんかはわかりやすいかも。