使用!!
时我得到一个奇怪的结果:
["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")
} ...
也许我误解了运算符优先级的工作原理,但如果有人能够解释的话,我想了解这里发生了什么。
答案 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 :(得分:1)
您应该检查Javascript运算符优先级,如下所示:
它表明逻辑NOT(!
)的优先级高于脚本等式(===
)运算符。
所以:
!!["a"].indexOf("b") === -1
评估为:
(!!["a"].indexOf("b")) === -1
这意味着(!!-1) === -1
显然是假的!!-1
是true
。
答案 2 :(得分:0)
按以下顺序评估:
AEM
所以关键是"a" // -> "a"
["a"] // -> ["a"]
["a"].indexOf("b") // -> -1
!!["a"].indexOf("b") // -> true
!!["a"].indexOf("b") === -1 // -> false
在.
之前评估。