JavaScript - ES2015仕様のNumber.isNaN() は数値判定に使えない

JavaScriptで数値判定を行う際に、isNaN()を使っている方がいると思います。

ES2015からはNumberオブジェクトのメソッドとして、 Number.isNan()メソッドが追加されました。

但し、残念ながらNumber.isNaN()は数値判定には全く使えないので注意が必要です。

普通の文字列を与えても「false」を返す

isNan()とNumber.isNaN()に文字列「'abc'」を引数として与えてみます。


console.log(isNaN('abc'));         // true

console.log(Number.isNaN('abc'));  // false

isNaN()では「true」が返ってくるので、「数値ではない」と判断できまが、

Number.isNaN()では「false」が返ってきます。

これでは数値判定に使えません。

戻り値が異なる理由

戻り値が異なるのは、仕様が異なるからです。

グローバルオブジェクトのisNaN()メソッドでは、 「引数が NaN (非数)かどうか」を判定します。

一方、Number.isNaN()メソッドでは、 「引数がNaN (非数)であり、且つNumber型かどうか」を判定します。

Number.isNaN()は、より堅牢な仕様に変更されているため、 今回のような違いが出てきます。

これまでのグローバルオブジェクトのisNaN()と同じ感覚で使っても、 同じ結果は得られないので注意が必要です。

数値判定のメソッドとしては、Number.isFinite()メソッドがおすすめです。

参考記事: 数値判定で一番使えるのはisNaN()?isFinite()?