JavaScript のグローバルに定義された値 4 つ、全部知ってますか?
こんにちは!江嵜です。
今回も JavaScript を掘っていきますよ。
皆さん、JavaScript で global に定義された値 4 種類、知ってますか?
2 つ、よく目にするのは null
と undefined
ですね。
この値の扱いに悩まされた方は多いかと思います。
こちらの二つは有名ですので、今回は置いておきまして…
今回は存在を知られていないかもしれない、
残り二つの NaN
と Infinity
という値について、勉強してみましょう!
NaN
NaN を発生させる方法その 1
NaN とは Not a Number の略で、日本語では非数といわれます。
つまり数字ではないもの、ということになりいますね。
こんなの何処で使うんだよと思われるかもしれませんが、
主に数学的に JavaScript で表現できない計算をさせてしまうと発生してしまいます。
分かりやすいところで行くとこれ。
Math.sqrt(-1) // = NaN
Math.sqrt()
は平方根(同じ数を掛け算して、渡された数になる)を求める計算ですね。
例えば、
Math.sqrt(9) // = 3
とすれば、 9 は 3 * 3 と、3 同士を掛け算して作られる数なので答えは 3 になります。
ではここで先ほどのものに戻って…
Math.sqrt(-1) // = NaN
これはどうでしょうか。掛け算して -1 になる数といいますと…
掛け算は (マイナス) * (マイナス) = (プラス) なので、 (-1) * (-1) = 1 になってしまって -1 は作れません。
という事で、掛け算して -1 になる数なんて存在しないのですね!
(数学の世界では、その存在しない数を「虚数」と定義していますが、またそれは別のお話…)
ということで、JavaScript の世界ではこの数字を表現できませんよ!ということで NaN
が返されます。
NaN を発生させる方法その 2
その他では
Number('ABC') // = NaN
これも NaN です。
Number()
は与えられた文字列を数字に変換するので
Number('100') // = 100
こんな感じにすれば 100 という文字を数字として扱えるようにして 100 が返されます。
が、しかしここに先程のように普通の文字を渡してしまうと、
Number('ABC') // = NaN
ABC は数字に変換できないので NaN となるのですね。
NaN は数字じゃないけど数字?
ちなみにこの NaN は面白い性質がありまして、
console.log(typeof NaN) // = "number"
として、 NaN の種類を確認すると NaN は数字だそうです。
NaN が作られるのは何かしら数を生成しようとした時なので、
数字として表わせられないけど数字なんだよ!というところでしょうか。
ややこしいですね。
ちなみに、
NaN == NaN // = false
NaN 同士を比べると false になります。
計算したときに生成される不正な数字を NaN として定義しているので、
NaN 同士の比較は一律 false として扱われているのですね。
(Number(‘ABC’) === Number(‘DEF’) が true ではおかしいですからね)
NaN を確認するときは
isNaN(NaN) // = true
と専用の isNaN()
というものがありますので、これを使いましょう。
Infinity
Infinity を発生させる方法その 1
もう一つ、 Infinity
です。
これは日本語訳すると「無限大」ですね。
これは JavaScript の世界では扱いきれないほどの大きな数字に対して使われます。
例えばコレ
Math.pow(10, 1000) // = Infinity
Math.pow()
は一つ目に与えられた数を、二つ目に与えられた回数だけ掛け算します。
Math.pow(2, 4) // = 16
であれば、 2 を 4 回なので、 2 * 2 * 2 * 2 = 16 ですね。
ではこれは?
Math.pow(10, 1000) // = Infinity
10 を 1000 回かけるので 1000… と、 0 が 1000 個並んだ数になります。
もはやなんて読むのか分からないほど大きな数ですね。
(ちなみに無量大数は 10 を 68 回かけたもの、 google の語源となった googol は 10 を 100 回かけたものだそうです)
そんなものを JavaScript の世界で扱うのはちょっと無理…ということで、
ここまで大きな数になると Infinity
として扱われるようです。
Infinity を発生させる方法その 2
他にも発生させる方法はあります。
1/0 // = Infinity
これだけ。
もしかして数学に詳しい方なら、
「なんでこれで Infinity? 0 で割る計算は出来ないはずでは?」
と思われるかもしれません。
そんな方は y = 1/x
のグラフを見ると謎が解けるかもしれませんね。
グラフを見たい方は wolframalpha で確認してみてくださいね。
ちなみに 0/0
は NaN です。
Infinity の面白い使い方
ちなみに、 Infinity も当然 number です
console.log(typeof Infinity) // = "number"
計算の結果生まれたものなので数字なんですね。
ということで…
for (var i = 0; i < Infinity; i++) { // 無限ループ! }
こうすると i が無限大回になるまでループすることになるので(実際には無限大にはなれませんが)
本物の無限ループが作れます。
無限ループを作りたければ while(true){}
の方がなじみのある形なので、
これはお遊びで実際に使うことはないですけどね。
また、こちらも使うことはないかと思いますが
1 / Infinity // = 0
Infinity で割るとしっかり 0 になります。
Infinity/Infinity // = NaN
やっぱり 無限大 / 無限大 は出来なくて NaN になりますけどね。
何かの拍子に現れてもあわてないで!
さて、今回は余り知られていない NaN と Infinity についてお話いたしました。
見慣れない分何かの拍子に現れると、何が起こったのかと慌ててしまいますが、
これからは見かけても、「ああ、なんか変な計算をしてしまったんだな」くらいに思ってデバッグしてくださいね。