あんパン

こしあん派

JavaScriptの~で数値を丸める

あまり知られていないような気がするがJavaScriptには~という単項演算子がある*1

仕様書によれば

  1. Let expr be the result of evaluating UnaryExpression.
  2. Let oldValue be ToInt32(GetValue(expr)).
  3. Return the result of applying bitwise complement to oldValue. The result is a signed 32-bit integer.

となるとのこと。つまり、後置された項の値を32bitの整数に変換してビット反転を行う。これを2回行うとビット反転したものがさらに反転されて元の値に戻る。一回通すだけでも整数になっているためMath.floorと同じ効果を得ることができる。

ただし、Math.floorと全く等価なわけではない。ToInt32*2

If number is NaN, +0, −0, +∞, or −∞, return +0.

となっており、~~NaNを実行すると0になる。isNaN(Math.floor(NaN)) === trueだが、isNaN(~~NaN)にはならない。このような差に注意する必要がある。

なお、~~'123'のようにすると123が返される。よって、parseIntに近いことが実現できる。ショートコーディングや競技プログラミングなどで用いると便利。