首先解释下为什么 ~~ 可以达到 Math.floor() 类似的效果:关于 ~(位取反),我们可以从 ECMAScript 了解到它的算法,注意到第二步,再进行位取反前,需要先将数值进行 ToInt32 运算,而在 ToInt32 里,有一个 sign(number) * floor(abs(number))——这是取整的操作。 因此用 ~~ 来取整,实际是用 ToInt32 时的取整操作,类似的其他操作(如 num >> 0 ; num | 0)也一样。 但这些操作也有一个很大的问题,就是当需要取整的数超过 32 位里,操作会得到一个错误的值,因为在 ToInt32 里除了取整操作,还把 数值 % 232(转成 32 位数值)。 如 ~~17179869222.23042 == 38(正确取整后的值应该是 17179869222)
因此用 ~~ 来取整,实际是用 ToInt32 时的取整操作,类似的其他操作(如 num >> 0 ; num | 0)也一样。
如 ~~17179869222.23042 == 38(正确取整后的值应该是 17179869222)