isNaNは「値を数値に強制変換したけど非数な値」を判定する

JavaScriptのisNaN()は、引数の値が「非数であるか」を判定する関数です。数値であればFALSE、数値でなければTRUEを返します。

NaN = Not a Number

例えば、文字列は数値ではないのでTRUE(=非数)になると考えられます。しかしながら、文字列でもFALSEが返る、つまり「数値である」と判定するパターンがあるのです。

isNaN("abc"); // TRUE
isNaN("123"); // FALSE

これはisNaN()が引数の値を「数値型に強制変換した後」に非数であるかを判定するためです。

なので数値型でなくとも、数値へ変換できてしまう値に対しては、FALSEが返ってきます。

数値型に変換されてしまう値

以下は数値型に強制変換可能な値で、isNaN()でFALSEと判定される厄介なパターンです。

isNaN("123");    // FALSE
isNaN(true);    // FALSE
isNaN(false);    // FALSE
isNaN(null);    // FALSE
isNaN("");    // FALSE
isNaN(" ");    // FALSE
isNaN(new Date());    // FALSE

もう少し細かく見てみましょう。

数値からなる文字列はそのまま数値に変換されます。

Number("123"); // 123

Booleanの場合、trueは1、falseは0に変換できます。

Number(true); // 1
Number(false); // 0

null、空文字、半角スペースはそれぞれ0に変換されます。

Number(null); // 0
Number(""); // 0
Number(" "); // 0

Date型も数値に変換が可能です。ただし一旦String型にすると、非数となります。

Number(new Date()); // 1569329169921
Number(new Date().toString()); // NaN

isNaNで判定を行う「非数」は「値を数値に強制変換したけど非数な値」を意味します。
この意味をはき違えてしまうと、思わぬ動作につながるので注意が必要です。

Related Posts