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
。