【发布时间】:2013-05-12 22:20:41
【问题描述】:
我正在查看 SocketIO 源代码,它有这样的声明:
if (-~manager.get('blacklist').indexOf(packet.name)) {
-~ 这里的简写是什么意思?
【问题讨论】:
-
这不是“速记”,而是连续的两个运算符(
-和~)。
标签: javascript shorthand
我正在查看 SocketIO 源代码,它有这样的声明:
if (-~manager.get('blacklist').indexOf(packet.name)) {
-~ 这里的简写是什么意思?
【问题讨论】:
- 和~)。
标签: javascript shorthand
这似乎是一个技巧:
if(manager.get('blacklist').indexOf(packet.name) !== -1)
正如其他人提到的~ 是按位否定,它将翻转二进制数字。例如,00000001 变为 11111110,或者在十六进制中,0x01 变为 0xFE。
-1 作为有符号整数 32,这是所有按位运算符返回的(>>> 除外,它返回无符号整数 32)以十六进制表示为 0xFFFFFFFF。 ~(-1) 翻转位以产生0x00000000,即0。
减号只是在数字上否定数字。正如 zzzBov 提到的,在这种情况下它什么也不做。
-~(-1) === 0
和
~(-1) === 0
代码可以改成:
if(~manager.get('blacklist').indexOf(packet.name))
但是,在我看来,字符并没有那么高,所以更长的版本,可以说是更具可读性,会更好,或者实现一个包含方法会更好,这个版本最好留给执行此优化的 JavaScript 编译器或压缩器。
【讨论】:
这两个运算符不是任何东西的简写形式。 ~ 是按位否定,- 是标准否定。
~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表达会更好
【讨论】:
按位反转。
~0 == 0xFFFFFFFF == -1
~1 == 0xFFFFFFFE
减号是算术反转。因此,如果 indexOf 失败,则结果为 0(返回 -1)
【讨论】: