为什么!! 1 =="1"等于真,!! 2 =="2"等于假?

Mic*_*der 66 javascript

正如标题所述,为什么:

> !!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)NumberType(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.

  • +1难怪:`100 == true`总是假的.这引起了一些混乱,如同; 除了1这是一个正数之外,"负数"和"正数"`= = true`如何都是"假"?...你的解释在这个问题上确实掩盖了一些GreatLight.主要是****.** (7认同)
  • @MichaelRader如果你想比较这些值,你可能想要使用`===`运算符,它使用[Strict Equality Algorithm](http://es5.github.io/#x11.9.6) (5认同)
  • @MichaelRader当然可以,但在潜入之前请通过文档了解`===`的限制;-) (4认同)
  • 我喜欢当人们逐步分解代码时,因为并非所有人都知道背景中发生了什么.谢谢! (4认同)

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)


Arn*_*jar 5

它是一个优先的运算符问题.

!运营商是一个一元运算符.这意味着左侧必须是表达式或布尔值可评估的部分.请参阅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