JavaScriptでのInfinity(無限大)とNaN(非数)の判別方法まとめ

滅多に使うことはないけれど数値が正しいものかどうか判別するのに使われる特別な値

それが Infinity 無限大 )と NaN 非数 ) の2つです。

ここではこの2つを判別する方法についてまとめてみたいと思います。

InfinityとNaNとはそもそも何なのか

この2つは数でないものを表すときに使われる特別な値のことです。

それぞれについて簡単に説明すると次の通り

Infinityについて

Infinityはいわゆる無限大を表すのに使われる数値です。

MDNリファレンスによると次のように説明されていました。

 Infinity という値(正の無限大)は他のあらゆる数より大きい数です。この値は数学的に無限大のように振る舞います。例えば、Infinity を掛けたものは全て Infinity となり、Infinity で割ったものは全て 0 となります。

引用 : Infinity - JavaScript | MDN

他のあらゆる数より大きいというのが無限大の特徴です。

これについては数学的な無限大とほとんど同じ意味だと思います。

 

ちなみに無限大はさらに2種類に分けられて、次の定数で定義されています。

  • Number.POSITIVE_INFINITY
    正の無限大を表す数値。Infinityの初期値はこの値
  • Number.NEGATIVE_INFINITY
    負の無限大を表す数値

どちらも無限大ですが、Infinityの初期値は正の無限大のようです。

NaNについて

NaNは数でないもの(非数)を表すために使われる値のこと

MDNリファレンスによると次のような説明がされています。

プログラム中で NaN を使うことは非常にまれです。このプロパティは Math 関数が失敗したり (Math.sqrt(-1)) 、ある数へと構文解析しようとした関数が失敗するとき (parseInt("blabla")) に返される値です。

引用 : NaN - JavaScript | MDN

NaN自体はプログラム中に出てくることは少ないです。

ただ数学的な関数で失敗したり予期せぬ結果が出た時に返される模様

 

そしてNaNには少し変わった特徴もあります。

それはNaN同士は ==  や ===  で比較することができないということ

例えば次はNaN同士を比較しているコード

これを実行するとコンソールでは両方とも  false  と表示されてしまいます。

 

なので普通の比較ではNaNかどうか分からないということです。

ではどうやって判定すればいいかというのをInfinityの判定と一緒に次で紹介していきます。

InfinityとNaNのそれぞれの判別方法

判定にはそれぞれ次の関数を使います。

  • Infinityの判定
    有理数かどうかを調べるisFinite関数を使う
  • NaNの判定
    非数か調べるisNaN関数を使う

それぞれの関数の使い方についてさらに詳しく説明すると次の通り

isFinite関数

これは渡された値が有理数(Finite)かどうか調べる関数です。

有理数の時には  true  が返ってくるので、  false  が返されれば無限大だと判別できます。

 

そしてこの関数が有理数だと判断するのは渡された値が次のような場合

  • 整数や少数などの数値の場合
  • 数値と解釈できる文字列の場合
  • 真偽値(trueまたはfalse)の場合

純粋な数値だけでなく数値に変換できる文字列や真偽値を含む点にも注意です。

例えば次が有理数( isFinite == true )として判断される値を渡しているコード例

これらは全て有理数なのでtrueが返されます。

 

一方isFinite関数が無限大だと判断するのは次のような値の場合

  • 無限大になる数値や式
    例 :  0で割った式や Inifinity そのものが渡された場合
  • 無限大と解釈できる文字列
    例 :  '1' / '0' や 'Infinity' などが渡された場合
  • 数値ではないデータ
    例 : 配列や連想配列などが渡された場合

無限大と解釈できる数値はもちろん、数値でないデータも無限大と判断されます。

例えば次が無限大( isFinite == false )と解釈される値を渡しているコード例

これらは一部の例ですが、

無限大になる or 数値でない

という条件を満たすなら isFinite の返す値は  true  になります。

 

以上がisFinite関数を使った無限大かどうかを判断する方法です。

数学の無限大と違うのは数値以外でも判断しないといけないことですね。

isNaN関数

isNaN関数は渡された値がNaN(非数)か判別するために使われます。

渡された値が非数なら  true  、数なら  false  が返ってくるという関数です。

 

そしてこの関数で非数として判断され true が返されるのは次のような値

  • NaN, undefined
  • 数値として解釈できない文字列
  • 配列や連想配列などのデータ

一部例外はあるものの、数値ではないもの全般は非数だと判定されます。

例えば次が非数( isNaN == true )と判断される値を渡しているコード例

これらはほんの一例なので数値ではないものは基本的に非数になると思います。

 

一方isNaN関数で数と判断され false が返ってくるのは次のような値

  • 整数や少数などの数値
  • 数値と解釈できる文字列
  • 無限大(Infinity), ヌル(null)
  • 空文字または1つ以上の空白文字
  • 真偽値(trueまたはfalse)

基本的には数値と数値に変換できる文字列(空白や空文字も含む)が数とみなされます。

ただし  Infinity  と  null  も数として解釈されることには要注意ですね。

特にInfinityのチェックには先ほど紹介したisFinite関数を使った方が安全です。

例えば次が数( isNaN == false )と判断される値を渡しているコード例

Infinityとかnullまで数になっちゃうのはどうなの?

という気もしますが、そこはまた別のチェックが必要になりますね。

 

ということで非数かどうかチェックにはisNaN関数を使います。

ただし普通に数値以外だけが  true  になる訳ではないのでそこは要注意

ここまでのまとめ

ここまでのことを簡単にまとめます。

 

まずInfinityとNaNとはあらかじめ定義されている次のような値のこと

  • Infinity
    無限大。他のあらゆる数より大きい数
  • NaN
    数でないもの(非数)を表すために使われる値

 

そして値がInfinityまたはNaNか調べるために使える関数が次の2つ

  • isFinite関数
    渡された値が有理数なら  true  、無限大なら  false  を返してくる
  • isNaN関数
    渡された値が非数なら  true  、数なら  false  が返ってくる
    ただし Infinity や null も数として判定されることに注意!

特にNaNについては  ==  や  ===  で比較ができないので必ずisNaN関数を使うようにしましょう。

 

ということで値が無限大(Infinity)や非数(NaN)かどうかチェックをする方法を紹介しました。

頻繁に使うことはなさそうですが、覚えておくとどこかで役に立ちそうです。

ではでは・△・)ノ バイバイ