为什么!! 1 ==“1”等于真,!! 2 ==“2”等于假?

时间:2014-05-16 05:17:39

标签: javascript

正如标题所述,为什么:

> !!1=="1"

等于

True

> !!2=="2"

等于:

False

同样,为什么> "1"==true等于true> "2"==true等于false

我感到困惑。这些只是JS中的错误或者在这里发生了什么?

5 个答案:

答案 0 :(得分:208)

根据Operator precedence规则,逻辑!的优先级高于==。因此,在这两种情况下,首先评估!!

注意:我的this answer已解释了各种对象的真实性。

第一案例

!!1 == "1"

!1将被评估为false,因为1被视为Truthy。再次否定我们获得true。所以表达式变为

true == "1"

现在,当您使用==运算符时,强制规则启动,运算符根据ECMAScript 5.1规范中定义的The Abstract Equality Comparison Algorithm进行求值,

  

6。如果Type(x)Boolean,请返回比较结果ToNumber(x) == y

因此,true将转换为一个数字,根据ToNumber algorithm for Boolean values为1。现在表达式变为

1 == "1"

现在,

  

4。如果Type(x)NumberType(y)String,         返回比较结果x == ToNumber(y)

因此,根据ToNumber algorithm"1"将转换为数字,并且会给出1。这就是它在第一种情况下显示true的原因。

第二案例

这里适用相同的规则。

!!2 == "2"

变为

true == "2"

然后

1 == "2"

成为

1 == 2

不是true,这就是为什么第二种情况会打印false

答案 1 :(得分:13)

tldr;这是由于==运算符算法中的[ToNumber]次转换。

第一步是简化表达。由于!!x=="x"被解析为(!!x)=="x"!!a_truthy_expression -> true,因此相等的实际相关表达式为

!!1=="2" -> true=="1" -> Boolean==String
!!2=="2" -> true=="2" -> Boolean==String

然后查看11.9.3 The Abstract Equality Comparison Algorithm的规则并跟随应用程序产生

  

规则6 - 如果Type(x)是布尔值,则返回比较结果ToNumber(x)== y。

导致Number==String或1 ==“1”和1 ==“2”,分别为 1 。然后是规则

  

规则7 - 如果Type(x)是Number而Type(y)是String,   返回比较结果x == ToNumber(y)。

应用

导致Number==Number或1 == 1和1 == 2,分别 1 ;后者显然是假的。

  

规则1 - 如果Type(x)与Type(y)相同,则[by c.iii。]如果x是与y相同的Number值,则返回true [else return false]。

(相同的算法解释了应用补充规则时的String==Boolean情况。)


1 要查看应用的[ToNumber]规则,请考虑:

+false -> 0
+true  -> 1
+"1"   -> 1
+"2"   -> 2

答案 2 :(得分:5)

它是一个优先运算符问题。

!运算符是一元运算符。这意味着左侧必须是表达式或布尔值可评估的部分。见Javascript MDN

!!1==1 is not necessary !!(1==1)
!!2==2 is not necessary !!(2==2)

我认为如果等于运算符的优先级高于这些表达式,那么这些表达式应该是一致的!运营商。但是如果我们考虑相反的情况,那么我们就会评估第一个否定:

!!1 == 1
!1 -> false
!!1 -> true
!!1 == 1 

并与两个

!!2==2
!2 -> false
!!2 -> true
(!!2) == 2 -> false

那是因为!运算符优先于==运算符

请参阅Mozilla Operator Preference

答案 3 :(得分:1)

!!1等于true," 1"等于true(" 0"为false,其他每个字符串也是如此)。所以!!1 == "1"评估为true == true,这当然会返回true。

!!2也等于true。正如我之前提到的," 2"不是" 1",所以它是假的。因此,我们有true == false,当然会返回false。

如果你想看2(一个数字)是否等于" 2" (数字的字符串表示),然后您需要做的就是2 == "2",其评估为2 == 2,这是真的。不同之处在于我们没有将布尔值与布尔值进行比较。我们将数字与数字进行比较。

基本上,将!!放在数字前面会转换为布尔值,这会强制JavaScript将字符串转换为布尔值而不是数字。

答案 4 :(得分:-1)

因为" 1"可以被视为" true"当你做平等检查,而不是身份,但" 2" - 不能。