世にある大抵のプログラミング言語は、数値をゼロで割るとエラーや例外が発生します。
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つの方向性があるということです。
- 正の無限大(Number.POSITIVE_INFINITY)
- 負の無限大(Number.NEGATIVE_INFINITY)
つまり、これらは同じ値ではないということです。
var a = Infinity;
var b = -Infinity;
a === b; //=> false
これを理解できていなかったため、テストケースで予期せぬゼロ除算が発生していた箇所ではまってしまい、 jasmineのソースを一生懸命追いかける、などと間違った方向性に時間を費やしてしまいました。。。