【问题标题】:javascript - scope of !! (bang bang) in Boolean coercionjavascript - 范围!! (砰砰)布尔强制
【发布时间】:2018-04-10 11:26:28
【问题描述】:

我在使用!!时有一个奇怪的结果:

["a"].indexOf("b") === -1 // true
!!(["a"].indexOf("b") === -1) //true
!!["a"].indexOf("b") === -1 // false
!["a"].indexOf("b") === -1 //false

显然第一个和第二个结果和预期的一样,但是其他两个看起来很奇怪,对吧?我似乎找不到为什么第二个和第三个语句不等价的原因,我当然无法理解第三个和第四个语句如何可能具有相同的布尔值。

我的猜测是,!!["a"] 在评估语句的其余部分之前被评估为 true,但是你为什么不为 true.indexOf("b") 得到一个 TypeError??

也许我误解了运算符优先级的工作原理,但如果有人能够解释,我想了解这里发生了什么。

【问题讨论】:

  • (!!(["a"].indexOf("b"))) === -1 也将是错误的,如果这有助于澄清......truefalse 在类型和值上都不等于 -1
  • 是的!但这至少是有道理的,因为很容易看出它是如何评估为 true === -1 的,对吧?
  • 是的,这正是您的第三个示例正在做的事情。
  • 在这种情况下,!! 似乎是多余的,因为您从布尔结果开始。如果你想反转它,那么是的,需要括号:!(["a"].indexOf("b") === -1),但你可以重写为(IMO)更清晰的["a"].indexOf("b") !== -1["a"].indexOf("b") > -1
  • 您提到运算符优先级,因此您的问题得到了回答,例如here。在您关心的三件事中,成员访问的优先级高于逻辑非,而逻辑非又高于严格相等。我第一条评论中的括号只是澄清了这种关系。

标签: javascript boolean type-coercion


【解决方案1】:

!!["a"].indexOf("b") === -1 // false:

["a"].indexOf("b") 给出 -1 然后 !!-1 给出 true 不严格等于 -1 给出 false。

!["a"].indexOf("b") === -1 //false:

["a"].indexOf("b") 给出 -1 然后 !-1 给出 false 不严格等于 -1 给出 false。

这里值得注意的是,在数字上下文中,在这些比较中使用(通常除了比较两个字符串之外),true 为 1,false 为 0。因此,即使 == 也会给出两个 false。

另一个问题是precedence

  1. 函数调用(["a"].indexOf("b"))
  2. 逻辑非(!)
  3. 严格相等 (===)

【讨论】:

    【解决方案2】:

    您应该检查过 Javascript 运算符的优先级,可以在这里找到:

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table

    这表明逻辑非 (!) 的优先级高于脚本相等 (===) 运算符。

    所以:

    !!["a"].indexOf("b") === -1
    

    评估为:

    (!!["a"].indexOf("b")) === -1
    

    这意味着(!!-1) === -1 这显然是错误的,因为!!-1true

    【讨论】:

      【解决方案3】:

      这是按以下顺序评估的:

      "a" // -> "a"
      ["a"] // -> ["a"]
      ["a"].indexOf("b") // -> -1
      !!["a"].indexOf("b") // -> true
      !!["a"].indexOf("b") === -1 // -> false
      

      所以重点是.! 之前进行评估。

      【讨论】:

        猜你喜欢
        • 2020-07-31
        • 2018-10-22
        • 1970-01-01
        • 2014-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-25
        • 1970-01-01
        相关资源
        最近更新 更多