【问题标题】:What does -~ before .indexOf() mean?.indexOf() 之前的 -~ 是什么意思?
【发布时间】:2013-05-12 22:20:41
【问题描述】:

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

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

-~ 这里的简写是什么意思?

【问题讨论】:

  • 这不是“速记”,而是连续的两个运算符(-~)。

标签: javascript shorthand


【解决方案1】:

这似乎是一个技巧:

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 编译器或压缩器。

【讨论】:

    【解决方案2】:

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

    ~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表达会更好

    【讨论】:

      【解决方案3】:

      按位反转。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-12
        • 1970-01-01
        • 1970-01-01
        • 2017-02-08
        • 1970-01-01
        • 1970-01-01
        • 2011-02-05
        相关资源
        最近更新 更多