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();
- Equal! とダイアログで表示される。
- Not Equal! とダイアログで表示される。
- エラーが発生する。
- 上記以外
prototype.jsのソースを呼んだことのある人なんかはわかりやすいかも。