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
,这是真的。区别在于,我们不是在比较布尔值和布尔值。我们在比较一个数字和一个数字

基本上,放
转换为布尔值,这迫使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