我正在查看SocketIO源代码,它有这样的说法:
if (-~manager.get('blacklist').indexOf(packet.name)) {
-~
速记在这里意味着什么?
答案 0 :(得分:4)
按位反转。
~0 == 0xFFFFFFFF == -1
~1 == 0xFFFFFFFE
减号是算术反转。因此,如果indexOf失败(返回-1)
,则结果为0答案 1 :(得分:4)
这似乎是一个技巧:
if(manager.get('blacklist').indexOf(packet.name) !== -1)
正如其他人所提到的~
是按位否定,它将翻转二进制数字。例如,00000001
变为11111110
,或者在十六进制中,0x01
变为0xFE
。
-1
作为有符号的int 32,这是所有按位运算符返回的(除>>>
之外的返回无符号整数的32),以十六进制表示为0xFFFFFFFF
。 ~(-1)
翻转这些位以生成0x00000000
0
。
减号只是在数字上否定了数字。正如zzzBov所提到的,在这种情况下它什么都不做。
-~(-1) === 0
和
~(-1) === 0
代码可以更改为:
if(~manager.get('blacklist').indexOf(packet.name))
但是,在我看来,字符的价格并不高,所以较长的版本(可以说更具可读性)会更好,或者实现一个包含方法会更好,这个版本最好留给用于执行此优化的JavaScript编译器或压缩器。
答案 2 :(得分:3)
这两个运营商不是任何形式的简写形式。 ~
是按位否定,-
是标准否定。
~foo.indexOf(bar)
is a common shorthand for foo.contains(bar)
。由于结果用于if
语句,因此紧随其后的-
符号完全无用且无效。
-~
一起是将1
添加到数字的方法。它通常没有用,可以更好地表达为+ 1
,unless you're competing in a code golf where you're not allowed to use the digit 1