为什么“true”== true在JavaScript中显示false?
MDC描述==
运算符如下 :
如果两个操作数的types不同,JavaScript会转换操作数,然后进行严格的比较。 如果任一操作数是一个数字或一个布尔值,操作数将尽可能转换为数字。 否则,如果任一操作数是一个string,则另一个操作数将被转换为一个string(如果可能)。
考虑到这一点,我会评估"true" == true
,如下所示:
- 他们是同一types吗? 没有
- 操作数是数字还是布尔值? 是
- 我们可以转换成一个数字吗? 否 (
isNaN(Number("true")) // true
) - 操作数是string吗? 是
- 我们可以将另一个操作数转换为string吗? 是 (
String(true) === "true" // true
)
我已经结束了string"true"
和"true"
,这应该评估为true
,但JavaScript显示错误。
我错过了什么?
因为"true"
转换为NaN
,而true
则转换为1
。 所以他们不同。
就像你所报道的,两者都被转换成数字,因为至less可以是true
(见Erik Reppen的评论),然后进行比较。
==比较运算符在Ecma 5中定义为
- 如果Type(x)是Number和Type(y)是String,则返回比较结果x == ToNumber(y)。
- 如果Type(x)是String而Type(y)是Number,
- 如果Type(x)是布尔型,则返回比较结果ToNumber(x)== y。
- 如果Type(y)是布尔型,则返回比较结果x == ToNumber(y)。
所以,“true”== true被js引擎解释为
- “true”== toNumber(true)
- “true”== 1
- toNumber(“true”)== 1
- NaN == 1
===> false
根据抽象平等比较algorithm
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3
如果其中一个是一个布尔值,另一个不是,则布尔型转换为数字0或1.所以true == "true"
为false。