NaN を判定する - JavaScript

JavaScriptでNaNの値を判定するコードを紹介します。

概要

JavaScriptでNumber()関数で値を変換する際に、数値でない値が与えられた場合、結果の値はNaNになります。
NaNの値を利用して計算をすると、その後の計算結果もすべてNaNの値になるため、NaNを判定して値を補正したい場合があります。
この記事ではNaNの判定コードを紹介します。

書式

最新のWebブラウザでは Number.isNaN() メソッドを利用します。
Number.isNaN([判定する値])

NaNの場合はtrueが返ります。

補足
以前のWebブラウザで判定する場合には isNaN() 関数を利用します。
isNaN([判定する値])

[判定する値]にNaNを与えた場合はtrueが返りますが、文字列を与えた場合にも、文字列の値によってtrueを返す場合があります。。

NaNを判定しない場合の現象の確認

以下のHTMLファイルを作成します。
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
  <script type="text/javascript">
    function Func() {
      var elem = document.getElementById("text1");
      var value1 = elem.value;
      var value2 = Number(elem.value);

      var outElem1 = document.getElementById("output1");
      outElem1.innerText = value1;
      var outElem2 = document.getElementById("output2");
      outElem2.innerText = value2;

      var value3 = value2 + 5;
      var outElem3 = document.getElementById("output3");
      outElem3.innerText = value3;

    }
  </script>
</head>
<body>
  <p>Nan Check</p>
  <input id="text1" type="text" /><br />
  <button type="button" onclick="Func();">Exec</button><br />
  <hr />
  <div id="output1"></div>
  <div id="output2"></div>
  <div id="output3"></div>
</body>
</html>
テキストボックスに入力した値を Number()関数で数値に変換し、値をページに表示します。また、値に5を加算した値もページに表示します。

WebブラウザでHTMLを表示すると下図の画面が表示されます。


テキストボックスに "3" を入力し、[Exec]ボタンをクリックします。


下図の表示結果となります。入力した文字列をそのまま表示した"3"、数値に変換して表示した"3"、数値に変換して5を加算した"8"がページに表示されます。


続いて "P" を入力した場合の結果を確認します。[Exec]ボタンをクリックして処理を実行します。


入力した文字列をそのまま表示した"P"は表示できていますが、数値に変換した値は"NaN"となります。NaNの値に5を加算した値もNaNの表示になります。


計算結果がNaNの値になると不具合が発生する可能性があるため、NaNを判定し、NaNの場合は0とする処理を実装したい場合があります。
NaNを判定するコードに変更します。

プログラム例

コード

以下のHTMLファイルを作成します。
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
  <script type="text/javascript">
    function Func() {
      var elem = document.getElementById("text1");
      var value1 = elem.value;
      var value2 = Number(elem.value);

      var outElem1 = document.getElementById("output1");
      outElem1.innerText = value1;
      var outElem2 = document.getElementById("output2");
      outElem2.innerText = value2;

      if (Number.isNaN(value2) == true) {
        value2 = 0;
      }
      var value3 = value2 + 5;
      var outElem3 = document.getElementById("output3");
      outElem3.innerText = value3;

    }
  </script>
</head>
<body>
  <p>Nan Check</p>
  <input id="text1" type="text" /><br />
  <button type="button" onclick="Func();">Exec</button><br />
  <hr />
  <div id="output1"></div>
  <div id="output2"></div>
  <div id="output3"></div>
</body>
</html>

解説

下記のisNaN()関数による判定を追加しています。
入力した文字列を数値に変換した際、変換に失敗しNaNの値になった場合は、値を0として処理をします。
  if (Number.isNaN(value2) == true) {
    value2 = 0;
  }

実行結果

上記のHTMLファイルをWebブラウザで表示します。下図のページが表示されます。


テキストボックスに"8"を入力します。入力後[Exec]ボタンをクリックします。


下図の表示結果となります。入力した文字列をそのまま表示した"8"、数値に変換して表示した"8"、数値に変換して5を加算した"13"がページに表示されます。


続いて、 "R" を入力した場合の結果を確認します。[Exec]ボタンをクリックして処理を実行します。


下図の表示結果となります。入力した文字列をそのまま表示した"R"は画面に表示されます。 数値への変換は失敗したため、2番目の値は"NaN"の表示となります。5を加算した値は、NaNを判定し、元の値を0として設定したため、"5"がページに表示されます。


NaNを判定する処理を実装できました。

文字列を与えた場合の isNaN() 関数の戻り値

次のHTMLファイルを作成します。
isNaN() 関数と、Number.isNan() メソッドにいろいろな値を与えて戻り値の値を比較します。
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title></title>

  <script type="text/javascript">
    function Func() {
      var outElem1 = document.getElementById("output1");
      outElem1.innerText = "NaN:" + isNaN(NaN);
      var outElem2 = document.getElementById("output2");
      outElem2.innerText = "8:" + isNaN(8);
      var outElem3 = document.getElementById("output3");
      outElem3.innerText = "Penguin:" + isNaN("Penguin");
      var outElem4 = document.getElementById("output4");
      outElem4.innerText = "130:" + isNaN("130");
      var outElem5 = document.getElementById("output5");
      outElem4.innerText = "42,12:" + isNaN("42,12");
      var outElem6 = document.getElementById("output6");
      outElem6.innerText = "undefined:" + isNaN(undefined);

      var outElem1m = document.getElementById("output1m");
      outElem1m.innerText = "NaN:" + Number.isNaN(NaN);
      var outElem2m = document.getElementById("output2m");
      outElem2m.innerText = "8:" + Number.isNaN(8);
      var outElem3m = document.getElementById("output3m");
      outElem3m.innerText = "Penguin:" + Number.isNaN("Penguin");
      var outElem4m = document.getElementById("output4m");
      outElem4m.innerText = "130:" + Number.isNaN("130");
      var outElem5m = document.getElementById("output5m");
      outElem5m.innerText = "42,12:" + Number.isNaN("42:12");
      var outElem6m = document.getElementById("output6m");
      outElem6m.innerText = "undefined:" + Number.isNaN(undefined);

    }
  </script>

</head>
<body>
  <p>isNaN return value</p>
  <button type="button" onclick="Func();">Exec</button><br />
  <div id="output1"></div>
  <div id="output2"></div>
  <div id="output3"></div>
  <div id="output4"></div>
  <div id="output5"></div>
  <div id="output6"></div>
  <hr />
  <div id="output1m"></div>
  <div id="output2m"></div>
  <div id="output3m"></div>
  <div id="output4m"></div>
  <div id="output5m"></div>
  <div id="output6m"></div>

</body>
</html>

上記のHTMLファイルをWebブラウザで表示します。下図のページが表示されます。


[Exec]ボタンをクリックすると下図の結果が表示されます。


結果をまとめると以下の表になります。

入力値 isNaN() の結果 Number.isNaN() の結果
NaN true true
8 false false
"Penguin" true false
"130" false false
"42,12" true false
undefined true false

Number.isNaN() メソッドは、"NaN" の値が入力された場合のみに true を返します。
一方 isNaN()関数の場合は、"NaN" の値が入力された場合は true を返しますが、"Penguin" "42,12" といった文字列が入力された場合にも true を返します。 なお、"130"も文字列ですが、この文字列は数値に変換できるため、戻り値は false となります。また、undefined の場合も true を返します。

上記の結果より、isNaN() 関数はNaN以外の値でもtrueを返す場合があります。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2023-06-17
改訂日: 2024-03-16
iPentec all rights reserverd.