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を使うようにします。