正如标题所述,为什么:
> !!1=="1"
Run Code Online (Sandbox Code Playgroud)
等于
True
Run Code Online (Sandbox Code Playgroud)
和
> !!2=="2"
Run Code Online (Sandbox Code Playgroud)
等于:
False
Run Code Online (Sandbox Code Playgroud)
同样,为什么> "1"==true
平等true
和> "2"==true
平等false
我很困惑.这些只是JS中的错误或者这里发生了什么?
the*_*eye 208
根据运算符优先级规则,逻辑!
优先级高于==
.因此,在这两种情况下,!!
首先进行评估.
注意:在我的这个答案中已经解释了各种物体的真实性.
!!1 == "1"
Run Code Online (Sandbox Code Playgroud)
!1
将被评估false
,因为1
被认为是Truthy.我们再次否定了true
.所以表达成了
true == "1"
Run Code Online (Sandbox Code Playgroud)
现在,当您使用==
运算符时,强制规则启动,运算符根据 ECMAScript 5.1规范中定义的抽象等式比较算法进行评估,
6.如果
Type(x)
是Boolean
,则返回比较结果ToNumber(x) == y
.
因此,true
将转换为数字,根据ToNumber
布尔值的算法,该数字为1 .现在表达成了
1 == "1"
Run Code Online (Sandbox Code Playgroud)
现在,
4.如果
Type(x)
是Number
和Type(y)
是String
,返回比较的结果x == ToNumber(y)
.
因此,"1"
将转换为数字,并根据ToNumber
算法给出1 .这就是它true
在第一种情况下显示的原因.
这里适用相同的规则.
!!2 == "2"
Run Code Online (Sandbox Code Playgroud)
变
true == "2"
Run Code Online (Sandbox Code Playgroud)
然后
1 == "2"
Run Code Online (Sandbox Code Playgroud)
变成了
1 == 2
Run Code Online (Sandbox Code Playgroud)
这不是true
,这就是第二种情况打印的原因false
.
use*_*740 13
tldr; 这是由于运算符算法中的[ToNumber]转换所致==
.
第一步是简化表达.因为!!x=="x"
被解析为(!!x)=="x"
和!!a_truthy_expression -> true
,所以相等的实际相关表达式是
!!1=="2" -> true=="1" -> Boolean==String
!!2=="2" -> true=="2" -> Boolean==String
Run Code Online (Sandbox Code Playgroud)
然后再看看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相同的Number值,则返回true [else return false].
(相同的算法解释了String==Boolean
应用补充规则时的情况.)
1要查看应用的[ToNumber]规则,请考虑:
+false -> 0
+true -> 1
+"1" -> 1
+"2" -> 2
Run Code Online (Sandbox Code Playgroud)
它是一个优先的运算符问题.
该!
运营商是一个一元运算符.这意味着左侧必须是表达式或布尔值可评估的部分.请参阅Javascript MDN.
!!1==1 is not necessary !!(1==1)
!!2==2 is not necessary !!(2==2)
Run Code Online (Sandbox Code Playgroud)
我认为如果等于运算符的优先级高于这些表达式,那么这些表达式应该是一致的!运营商.但如果我们考虑相反的情况,那么我们就会评估出第一个否定:
!!1 == 1
!1 -> false
!!1 -> true
!!1 == 1
Run Code Online (Sandbox Code Playgroud)
并与两个
!!2==2
!2 -> false
!!2 -> true
(!!2) == 2 -> false
Run Code Online (Sandbox Code Playgroud)
那是因为!运算符优先于==运算符
请参阅Mozilla Operator Preference
归档时间: |
|
查看次数: |
12350 次 |
最近记录: |