javascript - 范围!! (bang bang)布尔强制

时间:2017-10-29 10:21:39

标签: javascript boolean type-coercion

使用!!时我得到一个奇怪的结果:

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

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

我的猜测是,!!["a"]在评估其余语句之前会被评估为true,但为什么不能为TypeError获得true.indexOf("b") } ...

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

3 个答案:

答案 0 :(得分:1)

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

[“a”]。indexOf(“b”)给出-1然后!! - 1给出true,它不严格等于-1,给出错误。

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

[“a”]。indexOf(“b”)给出-1然后!-1给出false,它不严格等于-1,给出false。

值得注意的是,在数字上下文中,在这些比较中使用(通常除了比较两个字符串),true为1,false为0.因此,即使==也会产生两个错误。< / p>

另一个问题是precedence

  1. 函数调用([“a”]。indexOf(“b”))
  2. 逻辑NOT(!)
  3. 严格平等(===)

答案 1 :(得分:1)

您应该检查Javascript运算符优先级,如下所示:

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

它表明逻辑NOT(!)的优先级高于脚本等式(===)运算符。

所以:

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

评估为:

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

这意味着(!!-1) === -1显然是假的!!-1true

答案 2 :(得分:0)

按以下顺序评估:

AEM

所以关键是"a" // -> "a" ["a"] // -> ["a"] ["a"].indexOf("b") // -> -1 !!["a"].indexOf("b") // -> true !!["a"].indexOf("b") === -1 // -> false .之前评估。