Javascript 为什么会这样!!1==";1“;真与假相等!!2==";2“;相等错误?
正如标题所述,为什么:Javascript 为什么会这样!!1==";1“;真与假相等!!2==";2“;相等错误?,javascript,Javascript,正如标题所述,为什么: > !!1=="1" 相等的 及 相等: False 同样,为什么>“1”==true等于true和>“2”==true等于false 我很困惑。这些只是JS中的错误还是这里发生了什么?因为当你进行平等性检查时,“1”可能被视为“真”,而不是身份,但“2”不能;这是由于=运算符算法中的转换 第一步是简化表达式。自从!!x==“x”的解析方式类似于(!!x)==“x”和!!a_truthy_表达式->true,等式的实际相关表达式为 !!1=="2" ->
> !!1=="1"
相等的
及
相等:
False
同样,为什么>“1”==true
等于true
和>“2”==true
等于false
我很困惑。这些只是JS中的错误还是这里发生了什么?因为当你进行平等性检查时,“1”可能被视为“真”,而不是身份,但“2”不能;这是由于=
运算符算法中的转换
第一步是简化表达式。自从<代码>!!x==“x”的解析方式类似于(!!x)==“x”
和!!a_truthy_表达式->true
,等式的实际相关表达式为
!!1=="2" -> true=="1" -> Boolean==String
!!2=="2" -> true=="2" -> Boolean==String
因此,接下来看看应用程序的规则和遵循的规则
规则6-如果类型(x)是布尔值,则返回比较结果ToNumber(x)==y
结果分别是Number==String
或1==“1”和1==“2”。那么规则呢
规则7-如果类型(x)是数字,类型(y)是字符串,
返回比较结果x==ToNumber(y)
应用的结果分别为Number==Number
或1==1和1==2;后者显然是错误的
规则1-如果类型(x)与类型(y)相同,则[根据c.iii.]如果x与y是相同的数值,则返回true[否则返回false]
(相同的算法解释了应用互补规则时的String==Boolean
情况。)
1要查看应用的[ToNumber]规则,请考虑:
+false -> 0
+true -> 1
+"1" -> 1
+"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”,所以它是假的。因此,我们有true==false
,它当然返回false
如果您想知道2(一个数字)是否等于“2”(一个数字的字符串表示),那么您所要做的就是2==“2”
,它的计算结果为2==2
,这是真的。区别在于,我们不是在比较布尔值和布尔值。我们在比较一个数字和一个数字
基本上,放数字前面的code>转换为布尔值,这迫使JavaScript将字符串转换为布尔值而不是数字。根据规则,逻辑代码>的优先级高于==
。因此,在这两种情况下,首先计算代码>
注:各种物体的真实性已在我的文章中解释过
第一例
!由于1
被认为是真实的,因此1
将被评估为false
。再次求反,我们得到true
。因此,表达式变为
true == "1"
1 == "1"
现在,强制规则开始生效,因为您使用了=
运算符,该运算符按照ECMAScript 5.1规范中定义的进行计算
六,。如果Type(x)
是Boolean
,则返回比较结果ToNumber(x)=y
因此,true
将被转换为一个数字,根据。现在表达式变为
true == "1"
1 == "1"
现在,
四,。如果类型(x)
是数字
,类型(y)
是字符串
,
返回比较结果x==ToNumber(y)
因此,“1”
将被转换为一个数字,根据。这就是为什么它在第一种情况下显示true
第二种情况
这里也适用同样的规则
!!2 == "2"
变成
true == "2"
然后
变成
1 == 2
这不是true
,这就是为什么第二个案例打印false
考虑!!2
vs!!1
-两者的计算结果均为true
(因此,1和2都是真实值)@Michael:2==“2”对您来说是否等于false?对我来说,它工作正常,这就是为什么你应该总是在JavaScript中使用==
进行比较。不,这不是一个bug。如果你不知道布尔和字符串是什么意思的话,你就不应该把它们作比较。这取决于你所说的“bug”是什么意思。在通常意义上,不,这不是一个bug-但它是一个设计缺陷。请注意,这些不是重复的。我们这里考虑的是将布尔值与数字字符串进行比较的情况,而不是类似的情况。这正是我所说的。你说:正如我前面提到的,“2”不是“1”。他说的是2==1
??。。。试着解释一下,我说过“1”是唯一一个等于真的字符串。因此,“2”等于false,它给出了表达式true==false
,因此为什么!!2==“2”
为假。-1。这些弦并不是由布尔人演奏的。布尔人是按数字铸造的。而且,“0”是假“是令人困惑的(如果没有错的话),因为“0”
是真的:!!“0”==true
和“0”==false
-1<代码>!!“”===false
,!!anyOtherString===true
。换句话说,空字符串是假的,所有其他字符串都是真的。你的第一句话直接与+1相矛盾,难怪:100==true
总是false。这让人有些困惑,比如:;除了1是正数外,负数
和正数
==真
怎么可能是假
?。。。你的解释确实有点模糊
true == "2"
1 == "2"
1 == 2