滅多に使うことはないけれど数値が正しいものかどうか判別するのに使われる特別な値
それが Infinity ( 無限大 )と NaN ( 非数 ) の2つです。
ここではこの2つを判別する方法についてまとめてみたいと思います。
InfinityとNaNとはそもそも何なのか
この2つは数でないものを表すときに使われる特別な値のことです。
それぞれについて簡単に説明すると次の通り
Infinityについて
Infinityはいわゆる無限大を表すのに使われる数値です。
MDNリファレンスによると次のように説明されていました。
Infinity
という値(正の無限大)は他のあらゆる数より大きい数です。この値は数学的に無限大のように振る舞います。例えば、Infinity
を掛けたものは全てInfinity
となり、Infinity
で割ったものは全て 0 となります。
他のあらゆる数より大きいというのが無限大の特徴です。
これについては数学的な無限大とほとんど同じ意味だと思います。
ちなみに無限大はさらに2種類に分けられて、次の定数で定義されています。
- Number.POSITIVE_INFINITY
正の無限大を表す数値。Infinityの初期値はこの値
- Number.NEGATIVE_INFINITY
負の無限大を表す数値
どちらも無限大ですが、Infinityの初期値は正の無限大のようです。
NaNについて
NaNは数でないもの(非数)を表すために使われる値のこと
MDNリファレンスによると次のような説明がされています。
プログラム中で
NaN
を使うことは非常にまれです。このプロパティはMath
関数が失敗したり (Math.sqrt(-1)
) 、ある数へと構文解析しようとした関数が失敗するとき (parseInt("blabla")
) に返される値です。
NaN自体はプログラム中に出てくることは少ないです。
ただ数学的な関数で失敗したり予期せぬ結果が出た時に返される模様
そしてNaNには少し変わった特徴もあります。
それはNaN同士は == や === で比較することができないということ
例えば次はNaN同士を比較しているコード
1 2 |
console.log(NaN == NaN); /// false console.log(NaN === NaN); /// false |
これを実行するとコンソールでは両方とも false と表示されてしまいます。
なので普通の比較ではNaNかどうか分からないということです。
ではどうやって判定すればいいかというのをInfinityの判定と一緒に次で紹介していきます。
InfinityとNaNのそれぞれの判別方法
判定にはそれぞれ次の関数を使います。
- Infinityの判定
有理数かどうかを調べるisFinite関数を使う
- NaNの判定
非数か調べるisNaN関数を使う
それぞれの関数の使い方についてさらに詳しく説明すると次の通り
isFinite関数
これは渡された値が有理数(Finite)かどうか調べる関数です。
有理数の時には true が返ってくるので、 false が返されれば無限大だと判別できます。
そしてこの関数が有理数だと判断するのは渡された値が次のような場合
- 整数や少数などの数値の場合
- 数値と解釈できる文字列の場合
- 真偽値(trueまたはfalse)の場合
純粋な数値だけでなく数値に変換できる文字列や真偽値を含む点にも注意です。
例えば次が有理数( isFinite == true )として判断される値を渡しているコード例
1 2 3 4 5 |
/** 有理数になる例 */ isFinite(3.141519); isFinite(0xabcdef); isFinite(1024 * '1024'); isFinite(false); |
これらは全て有理数なのでtrueが返されます。
一方isFinite関数が無限大だと判断するのは次のような値の場合
- 無限大になる数値や式
例 : 0で割った式や Inifinity そのものが渡された場合
- 無限大と解釈できる文字列
例 : '1' / '0' や 'Infinity' などが渡された場合
- 数値ではないデータ
例 : 配列や連想配列などが渡された場合
無限大と解釈できる数値はもちろん、数値でないデータも無限大と判断されます。
例えば次が無限大( isFinite == false )と解釈される値を渡しているコード例
1 2 3 4 5 6 7 8 9 |
/** 無限大と判断されるコード例 */ isFinite(Infinity); isFinite(1 / 0); isFinite(Math.pow(10, 500)); isFinite(Math.log(0)); isFinite('Infinity'); isFinite('abcdef'); isFinite({color: 'red'}); isFinite([1, 2, 3]); |
これらは一部の例ですが、
無限大になる or 数値でない
という条件を満たすなら isFinite の返す値は true になります。
以上がisFinite関数を使った無限大かどうかを判断する方法です。
数学の無限大と違うのは数値以外でも判断しないといけないことですね。
isNaN関数
isNaN関数は渡された値がNaN(非数)か判別するために使われます。
渡された値が非数なら true 、数なら false が返ってくるという関数です。
そしてこの関数で非数として判断され true が返されるのは次のような値
- NaN, undefined
- 数値として解釈できない文字列
- 配列や連想配列などのデータ
一部例外はあるものの、数値ではないもの全般は非数だと判定されます。
例えば次が非数( isNaN == true )と判断される値を渡しているコード例
1 2 3 4 5 6 7 |
/** 非数(Nan)と判定される例 */ isNaN(NaN); isNaN(undefined); isNaN({padding: '0'}); isNaN(['a', 'b', 'c']); isNaN('1024MB'); isNaN('NotNumber'); |
これらはほんの一例なので数値ではないものは基本的に非数になると思います。
一方isNaN関数で数と判断され false が返ってくるのは次のような値
- 整数や少数などの数値
- 数値と解釈できる文字列
- 無限大(Infinity), ヌル(null)
- 空文字または1つ以上の空白文字
- 真偽値(trueまたはfalse)
基本的には数値と数値に変換できる文字列(空白や空文字も含む)が数とみなされます。
ただし Infinity と null も数として解釈されることには要注意ですね。
特にInfinityのチェックには先ほど紹介したisFinite関数を使った方が安全です。
例えば次が数( isNaN == false )と判断される値を渡しているコード例
1 2 3 4 5 6 7 8 |
/** 数と判定される例 */ isNaN(1024); isNaN('3.1415'); isNaN(Infinity); isNaN(null); isNaN(''); isNaN(' '); isNaN(true); |
Infinityとかnullまで数になっちゃうのはどうなの?
という気もしますが、そこはまた別のチェックが必要になりますね。
ということで非数かどうかチェックにはisNaN関数を使います。
ただし普通に数値以外だけが true になる訳ではないのでそこは要注意
ここまでのまとめ
ここまでのことを簡単にまとめます。
まずInfinityとNaNとはあらかじめ定義されている次のような値のこと
- Infinity
無限大。他のあらゆる数より大きい数
- NaN
数でないもの(非数)を表すために使われる値
そして値がInfinityまたはNaNか調べるために使える関数が次の2つ
- isFinite関数
渡された値が有理数なら true 、無限大なら false を返してくる
- isNaN関数
渡された値が非数なら true 、数なら false が返ってくる
ただし Infinity や null も数として判定されることに注意!
特にNaNについては == や === で比較ができないので必ずisNaN関数を使うようにしましょう。
ということで値が無限大(Infinity)や非数(NaN)かどうかチェックをする方法を紹介しました。
頻繁に使うことはなさそうですが、覚えておくとどこかで役に立ちそうです。
ではでは・△・)ノ バイバイ