JavaScript にある NaN と Infinity という値、知ってますか?

JavaScript のグローバルに定義された値 4 つ、全部知ってますか?

こんにちは!江嵜です。

今回も JavaScript を掘っていきますよ。

皆さん、JavaScript で global に定義された値 4 種類、知ってますか?

2 つ、よく目にするのは nullundefined ですね。
この値の扱いに悩まされた方は多いかと思います。
こちらの二つは有名ですので、今回は置いておきまして…

今回は存在を知られていないかもしれない、
残り二つの NaNInfinity という値について、勉強してみましょう!

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 についてお話いたしました。

見慣れない分何かの拍子に現れると、何が起こったのかと慌ててしまいますが、
これからは見かけても、「ああ、なんか変な計算をしてしまったんだな」くらいに思ってデバッグしてくださいね。

Takato Ezaki

Takato Ezaki小中高の塾講師からエンジニア

投稿者プロフィール

福岡で Web 系のエンジニアをしています。

中高の理科教師免許を取り、起業に 2 年間トライした後エンジニアの道へ入りました。

化学反応の中では Belousov-Zhabotinsky 反応が大好きです。

この著者の最新の記事

関連記事

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

募集中!(o゜▽゜)o

エンジャパン
求む、社長!
follow us in feedly

コッチもヨロシク!





最近のネタ!

  1. 2018-11-16

    第3回アウトドア部 ~秋めいてきましたねぇ~

    2018/10/27(土)、アウトドア部の3回目の活動!! 今回は釣り掘に釣りに行きましたよっ!🎣 …
  2. 2018-11-12

    あなたのお気に入りは? Build your own octocat で素敵な Octocat を作ろう!

    Octocat、 ご存知ですよね? こんにちは!江嵜です。 みなさん、 Octocat (オクトキ…
  3. 2018-11-7

    第1回 リーダーに興味がある人向け勉強会!!

    2018/11/4(日)に「リーダーに興味がある人向け勉強会」が開催されました! 勉強会の様子をお…
  4. 2018-11-6

    2018年10月度社員総会&懇親会@Tokyo 〜 全社員総会直前Special! 〜

    今期もあとわずか! 2018年10月19日(金)に、東京オフィスの2018年10月度の社員総会がお…
  5. 2018-11-5

    JavaScript にある NaN と Infinity という値、知ってますか?

    JavaScript のグローバルに定義された値 4 つ、全部知ってますか? こんにちは!江嵜です…
ページ上部へ戻る