NaN(Not a Number)は、数値以外であることを表す特別な値です。
等価演算子(==)と同値演算子(===)では、どちらかの値がNaNの場合は常にfalseを返すため、
NaNであるか判定することができません。
そこで判定に使用されるisNaN()関数ですが、
厳密には、NaNかどうかではなく、数値に変換できるかどうかの判定をしているようです。
NaNであるかのきちんとした判定には、ECMAScript6で追加されたNumber.isNaN()を使用するのがいいようです。
isNaN
引数が数に変換できない場合はtrue、数に変換できる場合はfalseを返すので、
NaNへと変換されるものに対してもtrueを返します。
isNaN(1); // false isNaN(NaN); // true isNaN("NaN"); // true
isNaN(null); // false isNaN(undefined); // true
nullは数値に変換すると0になるのでfalse、
undefinedは数値に変換するとNaNになるのでtrueを返します。
isNaN(true); // false isNaN(false); // false
論理値のtrue、falseは数値に変換すると1と0に変換されるので、falseを返します。
Number.isNaN
引数がNaN のときだけ true を返します。
現在はまだChrome、Firefoxでしかサポートされていません。
Number.isNaN(NaN); // true Number.isNaN("NaN"); // false
ポリフィル
Number.isNaN = Number.isNaN || function(value) { return typeof value === "number" && value !== value; }
■参考サイト
NaNの判定について
Number.isNaN() | JavaScript 日本語リファレンス | js STUDIO
Number.isNaN() - JavaScript | MDN
NaN をなんとかしたい上での諸注意 と global.isFinite() の罠