panther-king's blog

JavaScriptのゼロ除算

世にある大抵のプログラミング言語は、数値をゼロで割るとエラーや例外が発生します。

PHP

echo 1 / 0;
//=> PHP warning: Division by zero on line 1

Python

print(1 / 0)
#=> ZeroDivisionError: division by zero

Ruby

puts 1 / 0
#=> ZeroDivisionError: divided by 0

Scala

println(1 / 0)
//=> java.lang.ArithmeticException: / by zero

ところが、JavaScriptだけはこの常識が当てはまりません。

JavaScript

console.info(1 / 0);
//=> Infinity

エラー警告も例外も発生せず、 Infinity という値が返ってきました。 この「Infinity」とは何なのでしょうか?

MDNに説明がありました。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Infinity

「無限大」を表現するグローバルなオブジェクトのようです。 これだけならそういうものだと覚えてしまえば良いのですが、気を付けないといけない点があります。

MDNの説明にもありますが、Infinityの初期値は 正の無限大 です。

Infinityの初期値は Number.POSITIVE_INFINITY です。

数学に疎い人間からすると、無限大は無限大というただ1つの値だとイメージしてしまいますが、 2つの方向性があるということです。

つまり、これらは同じ値ではないということです。

var a = Infinity;
var b = -Infinity;
a === b; //=> false

これを理解できていなかったため、テストケースで予期せぬゼロ除算が発生していた箇所ではまってしまい、 jasmineのソースを一生懸命追いかける、などと間違った方向性に時間を費やしてしまいました。。。

JavaScript