あまり知られていないような気がするがJavaScriptには~
という単項演算子がある*1。
仕様書によれば
- Let expr be the result of evaluating UnaryExpression.
- Let oldValue be ToInt32(GetValue(expr)).
- 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に近いことが実現できる。ショートコーディングや競技プログラミングなどで用いると便利。