2

我正在查看 SocketIO 源代码,它有这样的声明:

if (-~manager.get('blacklist').indexOf(packet.name)) {

-~这里的速记是什么意思?

4

3 回答 3

4

位反转。

~0 == 0xFFFFFFFF == -1
~1 == 0xFFFFFFFE

减号是算术反转。因此,如果 indexOf 失败,则结果为 0(返回 -1)

于 2013-05-17T16:54:49.333 回答
4

这似乎是一个技巧:

if(manager.get('blacklist').indexOf(packet.name) !== -1)

正如其他人所提到的,~按位否定会翻转二进制数字。00000001变成11111110例如,或者在十六进制中,0x01变成0xFE.

-1作为一个有符号整数 32,这是所有按位运算符返回的(除了>>>返回无符号整数 32)在十六进制中表示为0xFFFFFFFF. ~(-1)翻转位以产生0x00000000is 0

减号只是在数字上否定数字。正如 zzzBov 提到的,在这种情况下它什么也不做。

-~(-1) === 0

~(-1) === 0

代码可以改成:

if(~manager.get('blacklist').indexOf(packet.name))

但是,在我看来,字符并没有那么珍贵,所以更长的版本,可以说是更具可读性,会更好,或者实现包含方法会更好,这个版本最好留给 JavaScript 编译器或压缩器来执行此优化。

于 2013-05-17T16:57:18.587 回答
3

这两个运算符不是任何东西的简写形式。~是按位否定,并且-是标准否定。

~foo.indexOf(bar)是 的常用简写foo.contains(bar)。因为结果是在if语句中使用的,所以-紧随其后的符号完全没有用,也没有任何意义。

-~一起是增加1一个数字的一​​种手段。它通常没有用,最好表示为+ 1除非您参加的是不允许使用数字的代码高尔夫1

于 2013-05-17T16:58:26.683 回答