正如标题所述,为什么:
> !!1=="1"
等于
True
和
> !!2=="2"
等于:
False
同样,为什么> "1"==true
等于true
和> "2"==true
等于false
我感到困惑。这些只是JS中的错误或者在这里发生了什么?
答案 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)
为Number
且Type(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
那是因为!运算符优先于==运算符
答案 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" - 不能。