今天在一代码中到这样一句:

~~(Math.random() * 2e3)

其中的代码上用到了位运算符~(按位非),在平时的编程中很少用到位运算符,只是学习编程基础的时候看到过,也没多做了解,既然现在遇到了,就打算对这一运算符一探究竟。
其实上面那一段代码用可读性强的方式来写的话,如下面

parseInt(Math.random()*2e3)

那为什么使用~~能实现parseInt取整的效果呢?
《Javascript权威指南》里是这么说的:

位运算符"~"是一元运算符,位于一个整型参数之前,它将操作数的所有位取反。根据javascript中所带符号的整数的表示方法,对一个值使用"~",运算符相当于改变它的符号并减1。例如~0x0F
= 0xFFFFFFF0或-16。
请注意,上面的句子中提到的是所带符号的整数!那么也就是说~9.88只是取整数部分,也即是~9。

根据上面的描述,使用~相当于改变参数的符号并减1,那么也就是:

~9 => -9 - 1 =>  -10

然而,使用两个~,那么就是相当于boolean中的!!一样,只是!!返回的是布尔类型,~~返回的是原来的值,如果参数是小数的话,就相当于对该参数取整!


krew
1.3k 声望25 粉丝

脚踏实地