operator - javascript是什么




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

正如标题所述,为什么:

> !!1=="1"

等于

True

> !!2=="2"

等于:

False

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

我很困惑。 这些只是JS中的错误还是这里发生了什么?


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抽象平等比较算法的规则,并跟随应用程序产出

规则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的数值相同,则返回true [否则返回false]。

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

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

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

!!1等于真,并且“1”等于真(“0”是假,所以是每隔一个字符串)。 因此!!1 == "1"计算结果为true == true ,这当然会返回true。

!!2也等于真。 正如我前面提到的,“2”不是“1”,所以它是错误的。 因此,我们有true == false ,这当然返回false。

如果你想看看2(一个数字)是否等于“2”(一个数字的字符串表示),那么你所要做的就是2 == "2" ,它的计算结果为2 == 2 ,这就是真正。 不同之处在于我们没有比较布尔值和布尔值。 我们正在比较一个数字和一个数字。

基本上,把!! 在数字前面转换为布尔值,这会迫使JavaScript将您的字符串转换为布尔值而不是数字。


因为当您进行平等检查时,“1”可能被视为“真实”,而不是“身份”,但“2” - 不能。


根据运算符优先级规则,逻辑!==拥有更高的优先级。 所以,在这两种情况下, !! 首先进行评估。

注意:在我的答案中已经解释了各种物体的真实性。

第一种情况

!!1 == "1"

!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

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





javascript