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