人には難しい気がする機械の真偽

自分が良く書くJavaScriptでは、ある値があるかないかを簡素なif文にして処理を切り分けることがある。結論は型までちゃんと評価しろという話なのだけど、何度もハマってしまうから記事に残しておくことにする。タイトルは覚えられていなかった言い訳。

極端にいうと、だいたいこんな感じのJavaScriptとなる。

var n = 0;

function func(){
    // hoge を huga したりする
};

if(n){
    func(); // 実行されない
}

n、あるじゃないか! n = 0じゃないか!なんでや!って思って夜中にハマって泣く泣く寝るに至ったけど、elseを書いたらそっちが通ったので数値の0はJavaScriptでは偽扱いになるのだということをまた忘れていたことを今朝嘆いた。

この真偽について何度もハマったと冒頭に書いたとおりなので、自分で一覧にしておくことにした。

true false 整数の0 整数の1 少数の0.0 文字列の0 空文字 空配列 空オブジェクト null undefined NaN
真偽

表が見づらい。

JSFiddleで確認できるようにもしてみた。Resultのタブから各値のボタンをクリックすると真偽が出るようにしている。検証コード側はあまりスマートではない。正常にテストできているかもちょっとわからない。

これでハマった時は自分のブログを見れば良くなった。自分が楽になることはどんどんやっていきたい。


JavaScriptに限らず、どの値で真か偽かは他言語でもそれぞれ決まりがあり、言語間でそれほどご互換性があるようには見えない。その差異は設計思想の差異と言うことでこのブログでは議論をしないが、こういった真偽の扱いについては誰しもが一度はハマり、憤りを覚え、目を濁らせて、やがて鋼の心を手に入れるのだ、いわばそのためのダンジョンなのだと、前職のJSerが言っていたのを思い出した。レベルが上ってからも行けるダンジョンは楽しい。