LoginSignup
92

More than 5 years have passed since last update.

NaNの判定について

Last updated at Posted at 2014-02-11

NaNをisNaNで判定しようとするとおかしな事になる可能性があるので気をつけましょうって話です。
Effective JavaScriptで紹介されていたのですが、知らなかったのでメモです。

isNaNの挙動

標準で用意されているisNaNにNaNを渡すと確かにtrueが返ります。
ただ、暗黙の型変換によって引数を数値へと変換してしまう為、NaN自身でなくても、NaNへと変換される類のものに対してもtrueを返してしまいます。

isNaN(NaN);                // true
isNaN("foo");              // true
isNaN(undefined);          // true
isNaN({});                 // true
isNaN({ valueOf: "foo" }); // true

isNaNはNaNであるかの判定ではなく、引数が数値へ変換可能かどうかの判定に使われるみたいです。

NaN判定のイディオム

Effective JavaScriptでは、NaNが自身との等号判定でfalseを返すという性質を利用して、以下のようなイディオムが紹介されていました。

NaN === NaN    // falseを返す!!!
function isReallyNaN(x) {
  return x !== x;    // xがNaNであればtrue, それ以外ではfalse
}

確かに、これで判定出来ますね。

Number.isNaN

ECMAScript6ではNumber.isNaNというのが策定されて、きちんとNaNを判別出来るようになったようです。

Number.isNaN(NaN);   // true
Number.isNaN('NaN'); // false

このページを参考にしました。
標準で判定用の関数が用意されるなら、そちらを使った方が良さそうですね。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
92