布尔值与数字比较中的JavaScript真实性

布尔值与数字比较中的JavaScript真实性,javascript,string,boolean,Javascript,String,Boolean,我是JavaScript新手,我正试图从互联网资源中学习它。虽然我知道会有很多cr*p材料,但大多数人似乎都同意JS中的真实性(仅举一个例子) 现在我在实验中发现了一件奇怪的事情: (true==2)为false。为什么? 据我所知,2是一个非零数,因此它应该被计算为true布尔true常量被提升为一个数字,即1。这是因为当相等运算符的任一操作数都是数字时,在几乎所有情况下,另一个操作数都转换为一个数字,然后比较结果。因此,您将1(从true转换而来)与2进行比较,而不是true与true进行比

我是JavaScript新手,我正试图从互联网资源中学习它。虽然我知道会有很多cr*p材料,但大多数人似乎都同意JS中的真实性(仅举一个例子)

现在我在实验中发现了一件奇怪的事情:

(true==2)
false
。为什么?


据我所知,
2
是一个非零数,因此它应该被计算为
true
布尔
true
常量被提升为一个数字,即1。

这是因为当相等运算符的任一操作数都是数字时,在几乎所有情况下,另一个操作数都转换为一个数字,然后比较结果。因此,您将
1
(从
true
转换而来)与
2
进行比较,而不是
true
true
进行比较。该规则的唯一例外是
null
未定义的
,以及默认值为
null
未定义的对象(参见下面的主题);将一个数字与那些返回值进行比较
false
(即使
number(null)
0
,也不要问)

详情见第11.9.3节:“抽象等式比较算法”。这是ES 5.1中该部分的文本,但该链接与当前的编辑草稿(即每年的快照规范所依据的内容)有关,并且存在以下几个方面:

比较x==y,其中x和y是值,生成true或false。这样的比较如下所示:

  • 如果(x)与(y)相同,则
  • 返回执行x==y的结果
  • 如果x为null而y未定义,则返回true
  • 如果x未定义且y为null,则返回true
  • 注意:第节中替换了此步骤
  • 如果(x)是数字,(y)是字符串,则返回比较结果x==!(y)
  • 如果(x)是字符串,(y)是数字,则返回比较结果!(x) ==y
  • 如果(x)是BigInt,而(y)是String,那么
  • 让我们走吧!(y)
  • 如果n为NaN,则返回false
  • 返回比较结果x==n
  • 如果(x)是String,而(y)是BigInt,则返回比较结果y==x
  • 如果(x)是布尔值,则返回比较结果!(x) ==y
  • 如果(y)是布尔值,则返回比较结果x==!(y)
  • 如果(x)是字符串、数字、BigInt或符号,而(y)是对象,则返回比较结果x==?(y)
  • 如果(x)是Object,而(y)是String、Number、BigInt或Symbol,则返回比较结果?(x)==y
  • 如果(x)是BigInt而(y)是Number,或者如果(x)是Number而(y)是BigInt,那么
  • 如果x或y是NaN中的任何一个+∞ 使用非严格比较(
    ==
    )时,如果操作数不是同一类型,则将强制/强制它们并进行严格比较,如果其中一个操作数是数字或布尔值(),则首选数字

    因此
    true==2
    计算为
    Number(true)==2
    ,即
    1==2
    ,即为false

    当然,您可以随时强制进行比较,因为这是明确的,可以解决以后难以发现的问题:

    true==Boolean(2)
    为true