字位截除
一些开发人员使用
~~
来截除数字值的小数部分,以为这和
Math.floor(..)
的效果一样,
实际上并非如此。
~~
中的第一个
~
执行
ToInt32
并反转字位,然后第二个
~
再进行一次字位反转,即将所有
字位反转回原值,最后得到的仍然是
ToInt32
的结果。
~~
和
!!
很相似,我们将在
4.3.3
节中介绍。
对
~~
我们要多加注意。首先它只适用于
32
位数字,更重要的是它对负数的处理与
Math.
floor(..)
不同。
Math.floor( -49.6 ); // -50
~~-49.6; // -49
~~x
能将值截除为一个
32
位整数,
x | 0
也可以,而且看起来还更简洁。
出于对运算符优先级(详见第
5
章)的考虑,我们可能更倾向于使用
~~x
:
~~1E20 / 10; // 166199296
1E20 | 0 / 10; // 1661992960
(1E20 | 0) / 10; // 166199296
我们在使用
~
和
~~
进行此类转换时需要确保其他人也能够看得懂。