正如标题所述,为什么会发生以下情况:
> !!1=="1"
相等的
True
和
> !!2=="2"
相等:
False
同样地,为什么> "1"==true
等于true
,而> "2"==true
等于false
?我感到困惑。这是JS中的错误吗?还是其他原因?
正如标题所述,为什么会发生以下情况:
> !!1=="1"
相等的
True
和
> !!2=="2"
相等:
False
同样地,为什么> "1"==true
等于true
,而> "2"==true
等于false
?!
的优先级高于 ==
。因此,在两种情况下,!!
都会首先被计算。
注意:各种对象的真值已在我这篇答案中解释过。
!!1 == "1"
!1
将被评估为false
,因为1
被认为是Truthy。再次取反,我们得到true
。所以表达式变成了:
!1
会被评估为false
,因为1
被视为Truthy(真的值)。再次取反后,它就变成了true
。因此,该表达式变成了:
true == "1"
现在,因为你使用了==
运算符,所以强制规则生效,该运算符的计算方式遵循在ECMAScript 5.1规范中定义的抽象相等比较算法。
6. 如果
Type(x)
是Boolean
类型,则返回比较的结果ToNumber(x) == y
。
因此,true
将被转换为数字,根据ToNumber
布尔值算法,其结果为1。现在表达式变成了:
1 == "1"
现在,
4. 如果
Type(x)
是Number
而Type(y)
是String
, 返回比较的结果x == ToNumber(y)
。
因此,根据ToNumber
算法,“1”将被转换为数字,结果将为1。这就是为什么第一个案例显示“true”的原因。
同样的规则也适用于这里。
!!2 == "2"
成为
true == "2"
然后
1 == "2"
这会变成
1 == 2
这是因为第二种情况打印的是 false
,意味着它不是true
。
100 == true
总是为假。这引起了一些困惑,比如;除了1这个正数之外,如何使得负数
和正数
的== true
都是假的?...你的解释真的在这个问题上阐明了一些重要的观点,尤其是第四点。 - ErickBestvar1 = 2
和 var2 = 2
,则可以使用 if !!var1 and var2
,因为您不是检查这些数字的整数值,而是想要它们的布尔值。 - Jacqlyn==
运算符算法中的[ToNumber]转换引起的。!!x=="x"
被解析为(!!x)=="x"
且!!a_truthy_expression -> true
,因此相等性的实际相关表达式为:!!1=="2" -> true=="1" -> Boolean==String
!!2=="2" -> true=="2" -> Boolean==String
这会导致规则6 - 如果Type(x)为Boolean,则返回比较ToNumber(x)==y的结果。
Number==String
或1=="1"和1=="2"。然后应用规则:
这会导致规则7 - 如果Type(x)是Number且Type(y)是String,则返回比较x==ToNumber(y)的结果。
Number==Number
或1==1 和1==2,后者显然是错误的。
(当应用互补规则时,同样的算法解释了规则1 - 如果Type(x)与Type(y)相同,则[由c.iii.]如果x与y是相同的Number值,则返回true[否则返回false]。
String==Boolean
的情况。)
1要查看应用[ToNumber]规则,请考虑:
+false -> 0
+true -> 1
+"1" -> 1
+"2" -> 2
这是一个优先级操作符问题。
!
操作符是一个一元操作符。这意味着左侧必须是一个表达式或可求值的布尔值。请参见 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
!!1
等于true,"1"也等于true("0"是false,其他字符串也是)。所以!!1 == "1"
等同于true == true
,当然返回true。
!!2
也等于true。如我之前提到的,"2"不是"1",因此是false。因此,我们有true == false
,当然返回false。2 == "2"
,这会得到2 == 2
,为true。区别在于我们没有将布尔值与布尔值进行比较。我们正在将数字与数字进行比较。!!
会将其转换为布尔值,这迫使JavaScript将您的字符串强制转换为布尔值而不是数字。2 == 1
吗?请尝试解释一下这个观点。 - ErickBesttrue == false
,因此!!2 == "2"
是错误的。 - Meredith"0"
是真值:!!"0" === true
和"0" == false
。 - Bergi!!"" === false
, !!anyOtherString === true
,也就是空字符串为假值,其他所有字符串都为真值。你的第一句话直接与此相矛盾。 - erm410因为在进行相等性检查时,“1”可能被视为“true”,而不是身份,但“2”则不行。
!!2
和 !!1
- 两者都会评估为 true
(因此,1和2都是真值)。 - user2864740
===
,原因如下。 - tester