为什么真的不匹配';正确';双等号'==';用JavaScript?

为什么真的不匹配';正确';双等号'==';用JavaScript?,javascript,if-statement,casting,Javascript,If Statement,Casting,这一小部分代码花了很长时间才被注意到 我想如果我做下面的事情,那就好了 if('true' == true) { alert("Does not happen"); } 但它没有通过if条件 我认为double equals=匹配的是值而不是类型,因为匹配类型是=的工作 现在我的问题是为什么true类型转换为'true',或者为什么它要检查这些操作数的类型?Javascript的=是语言中最糟糕的部分之一,它是在不可理解的逻辑下构建的。。。我们有一个旧的规范,这就是答案 在完整的Fac

这一小部分代码花了很长时间才被注意到

我想如果我做下面的事情,那就好了

if('true' == true) {
    alert("Does not happen");
}
但它没有通过if条件

我认为double equals
=
匹配的是值而不是类型,因为匹配类型是
=
的工作


现在我的问题是为什么
true
类型转换为
'true'
,或者为什么它要检查这些操作数的类型?

Javascript的
=
是语言中最糟糕的部分之一,它是在不可理解的逻辑下构建的。。。我们有一个旧的规范,这就是答案

在完整的Facepalm上获取战利品:

为编辑进行编辑

是的,“类型转换”并不像我们预期的那样有效。。。没有其他答案/

请参阅


Type(x)
是字符串,
Type(y)
是布尔值。因此,第7步适用。它将布尔值转换为数字,并将其与字符串进行比较。您拥有的字符串与任何数字都不匹配。

在JavaScript boolean中,如果参数为true,则结果为1。如果参数为false,则结果为+0。因此,
'true'==true
相当于
'true'==1
,当然,这是false

'true' == true
这就是发生在这里的事情(根据:

--将布尔值转换为数字(规则7):

--将“真”转换为数字(规则5):

--
Number('true')
NaN

NaN == 1
--返回false(规则1.c.i)

=
确实令人困惑,但一旦你理解了规则,它就有了一些意义:

  • 垃圾等于垃圾(未定义==null)
  • 没有布尔值(它们作为数字进行比较)
  • 如果其中一个部分是数字,请比较数字
  • 如果其中一个部分是字符串,请将其作为字符串进行比较
  • 否则,a和b必须是相同的东西
“true”是字符串,
true
是布尔值,即string==boolean迄今为止最好(也是最简单)的解释!我不认为这就是这个算法在这里的工作原理。正确的步骤顺序是7-5-1.c.i.@thg435-Argh!我错过了
类型(y)
以及所有
类型(x)
都在那里。嗯,这并不能回答问题。两个操作数的转换完全按照规范进行,应该接受thg435的答案。
Number('true') == 1
NaN == 1