isNaNの謎を追え

スペックで調査しているうちに

JavaScriptのisNaNの挙動が、私の想定とは違う反応を示しました。スペック内のコードをわかりやすいように書き直してみますと、以下のとおりです。

var t = [Number.NEGATIVE_INFINITY,
         Number.POSITIVE_INFINITY,
         Number.NaN,
         {},
         [],
         "",
         "1",
         "-1",
         undefined,
         null];
for (var i=0,tli=t.length;i

結果は、

 false,
 false,
 true,
 true,
 false,
 false,
 false,
 false,
 true,
 false

Namber.NaNと{}とundefined以外はすべて、falseとなり、数値と評価されかねない事態となります。

この謎を調べてみました

nullが0として評価されるのはわかるのですが、それ以外はなぜかということがわからなかったので、早速、仕様(TAKI氏による翻訳)を調査しました。
そうすると、次のような文書を発見しました。

15.1.2.4 isNaN (number)

引数に ToNumber を適用し、結果が NaN であれば true, そうでなければ false を返す。
15.1.2.5 isFinite (number)

引数に ToNumber を適用し、結果が NaN, +∞, -∞ であれば false, そうでなければ true を返す。

15.1 Global オブジェクト (The Global Object)より引用

http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/15-1_Global_Object.html

このToNumberの適用があるために

isNaNの評価が想定したのとは別の結果となったようです。Infinityだけでも処置がしたいので、isNaNの代わりにisFiniteを使うようにします。