Unknown Region

プログラムでハマったエラーとその解決方法についての備忘録メモ

【JavaScript】Infinityへの加算及び減算の挙動について

何遍Infinityについて書いているんだと言われたら、何も言えないのだけれど(白目)

plugout.hateblo.jp

plugout.hateblo.jp

ゼロ除算自体が一般的にアンチパターンなので、意外と知らない事も多いなと。

今回はInfinityを使って加算及び減算した場合について備忘録がてら記録しておく。

今更ながらInfinityとは∞(無限)という意味で、JavaScriptではあえて指定しない限りは一般的にゼロ除算を行うと得られる値だ。

正の∞と負の∞が存在しており、それぞれ[Number.POSITIVE_INFINITY][Number.NEGATIVE_INFINITY]を利用して得る事ができる。

このInfinityに色々と数値の加算と減算をするとどうなるか。

例: コンソールで実行1

Number.POSITIVE_INFINITY + 1; // 正の∞に1を加算
> Infinity
Number.POSITIVE_INFINITY - 1; // 正の∞に1を減算
> Infinity
Number.POSITIVE_INFINITY + Number.POSITIVE_INFINITY; // 正の∞に正の∞を加算
> Infinity
Number.POSITIVE_INFINITY - Number.POSITIVE_INFINITY; // 正の∞に正の∞を減算
> NaN
Number.NEGATIVE_INFINITY + 1; // 負の∞に1を加算
> -Infinity
Number.NEGATIVE_INFINITY - 1; // 負の∞に1を減算
> -Infinity
Number.NEGATIVE_INFINITY + Number.NEGATIVE_INFINITY; // 負の∞に負の∞を加算
> -Infinity
Number.NEGATIVE_INFINITY - Number.NEGATIVE_INFINITY; // 負の∞に負の∞を減算
> NaN

単純に同じ符号同士で∞を減算すると非数であるNaNになった。

これは単純にそんな数は数値として表せないという事だろうか。

では、正の∞や負の∞に対して逆を加算及び減算するとどうなるのか。

 

例: コンソールで実行2

Number.POSITIVE_INFINITY + Number.NEGATIVE_INFINITY; // 正の∞に負の∞を加算
> NaN
Number.POSITIVE_INFINITY - Number.NEGATIVE_INFINITY; // 正の∞に負の∞を減算
> Infinity
Number.NEGATIVE_INFINITY + Number.POSITIVE_INFINITY; // 負の∞に正の∞を加算
> NaN
Number.NEGATIVE_INFINITY - Number.POSITIVE_INFINITY; // 負の∞に正の∞を減算
> -Infinity

違う符号同士の∞で減算を行うと、コンソールで実行1の同じ符号同士の∞の加算と同様の結果となった。

(∞ - (-∞) = ∞ + ∞ = ∞ということか)

 

では次に、JavaScriptには暗黙的な型変換というものがあるので、それを用いて[コンソールで実行1]と同じような加算・減算を行ってみる。

JavaScriptでは変数に型はないが値には型を持っていて、演算時には適切な型になるように暗黙的に変換が行われる。

 

例: コンソールで実行3

Number.POSITIVE_INFINITY + "1"; // 正の∞に文字列の1を加算
> "Infinity1"
Number.POSITIVE_INFINITY - "1"; // 正の∞に文字列の1を減算
> Infinity
Number.POSITIVE_INFINITY + "Infinity"; 正の∞に文字列の正の∞を加算
> "InfinityInfinity"
Number.POSITIVE_INFINITY - "Infinity"; 正の∞に文字列の正の∞を減算
> NaN
Number.NEGATIVE_INFINITY + "1"; // 負の∞に文字列の1を加算
> "-Infinity1"
Number.NEGATIVE_INFINITY - "1"; // 負の∞に文字列の1を減算
> -Infinity
Number.NEGATIVE_INFINITY + "-Infinity"; 負の∞に文字列の負の∞を加算
> "-Infinity-Infinity"
Number.NEGATIVE_INFINITY - "-Infinity"; 負の∞に文字列の負の∞を減算
> NaN
"Infinity" + 1; // 文字列の正の∞に文字列の1を加算
> "Infinity1"
"Infinity" - 1; // 文字列の正の∞に文字列の1を減算
> Infinity
"-Infinity" + 1; // 文字列の負の∞に文字列の1を加算
> "-Infinity1"
"-Infinity" - 1; // 文字列の負の∞に文字列の1を加算
> -Infinity

演算の値に文字列が含まれる場合、加算の場合は文字列結合として扱われてしまう。

InfinityInfinityってちょっと格好いいな

これはInfinityに限った話ではなく、単純な数値の加算でも発生する。

例えば["1" + 1]の結果は["11"]になる

減算の場合は正常に数値として扱われるからややこしい。

(Infinityという文字列も正常に数値として扱ってくれるようだ)

もしこの問題で困るなら、単純に自前で数値へ変換してやれば良い。

 

例: コンソールで実行4

1 + Number("1");
> 2
Number.POSITIVE_INFINITY + Number("1");
> Infinity
Number.NEGATIVE_INFINITY + Number("1");
> -Infinity
1 + Number("Infinity");
> Infinity
1 + Number("-Infinity");
> -Infinity

 

連絡先: plugout777★yahoo.co.jp (クローラー対策のため★を@に変更してください)