我正在查看 SocketIO 源代码,它有这样的声明:
if (-~manager.get('blacklist').indexOf(packet.name)) {
-~
这里的速记是什么意思?
我正在查看 SocketIO 源代码,它有这样的声明:
if (-~manager.get('blacklist').indexOf(packet.name)) {
-~
这里的速记是什么意思?
位反转。
~0 == 0xFFFFFFFF == -1
~1 == 0xFFFFFFFE
减号是算术反转。因此,如果 indexOf 失败,则结果为 0(返回 -1)
这似乎是一个技巧:
if(manager.get('blacklist').indexOf(packet.name) !== -1)
正如其他人所提到的,~
按位否定会翻转二进制数字。00000001
变成11111110
例如,或者在十六进制中,0x01
变成0xFE
.
-1
作为一个有符号整数 32,这是所有按位运算符返回的(除了>>>
返回无符号整数 32)在十六进制中表示为0xFFFFFFFF
. ~(-1)
翻转位以产生0x00000000
is 0
。
减号只是在数字上否定数字。正如 zzzBov 提到的,在这种情况下它什么也不做。
-~(-1) === 0
和
~(-1) === 0
代码可以改成:
if(~manager.get('blacklist').indexOf(packet.name))
但是,在我看来,字符并没有那么珍贵,所以更长的版本,可以说是更具可读性,会更好,或者实现包含方法会更好,这个版本最好留给 JavaScript 编译器或压缩器来执行此优化。
这两个运算符不是任何东西的简写形式。~
是按位否定,并且-
是标准否定。
~foo.indexOf(bar)
是 的常用简写foo.contains(bar)
。因为结果是在if
语句中使用的,所以-
紧随其后的符号完全没有用,也没有任何意义。
-~
一起是增加1
一个数字的一种手段。它通常没有用,最好表示为+ 1
,除非您参加的是不允许使用数字的代码高尔夫1