什么--~之前.indexOf()是什么意思?

时间:2013-05-17 16:53:43

标签: javascript shorthand

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

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

-~速记在这里意味着什么?

3 个答案:

答案 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添加到数字的方法。它通常没有用,可以更好地表达为+ 1unless you're competing in a code golf where you're not allowed to use the digit 1