Why does “true” == true show false in JavaScript?
MDC对==运算符的描述如下:
If the two operands are not of the same type, JavaScript converts the operands then applies strict comparison. If either operand is a number or a boolean, the operands are converted to numbers if possible; else if either operand is a string, the other operand is converted to a string if possible.
考虑到这一点,我将对"true" == true进行如下评估:
它们是同一类型的吗?不
操作数是数字还是布尔值?是的
我们能把两者都转换成数字吗?否(isNaN(Number("true")) // true)
操作数是否为字符串?是的
我们能把另一个操作数转换成字符串吗?是(String(true) ==="true" // true)
我最后得到的字符串是"true"和"true",应该对true进行评估,但javascript显示为假。
我错过了什么?
- 相关:es5.github.com/x11.9.1
- 有了这么多的javascript,世界是一个可怕的地方:if("true" == true) {console.log("yes")} else {console.log("no")}; if("true") {console.log("yes")} else {console.log("no")}---"不,是的"
- 我得说,我很惊讶,这真是太愚蠢了。还有另一个始终使用的原因===
- @用户1068352检查混乱:)dorey.github.io/javascript-equality-table
因为"true"转换成NaN,而true转换成1。所以他们不同。
正如您所报告的,这两个都被转换为数字,因为至少可以是true(参见erik reppen的评论),然后进行比较。
- 这就是为什么你永远不会看到我在我的JS中写== true-如果这个值是真实的,它将通过测试而不让我告诉它必须是真实的。
- 是的,没错。没有必要比较== true。只需让条件运算符/语句评估真实性。
- 那么,你能告诉我步骤Can we convert both to a number?何时会是错误的吗?如果连NaN都是一个数字,那么这个步骤怎么可能失败呢?
- 两者都不是。如果两者都会导致NaN,它们将切换到字符串评估。如果只能转换一个,则仍有一个数字比较。
- 实际上,JavaScript中有一些奇怪的对象的行为非常奇怪。例如,IE<9中的XML文档在试图将其转换为数字时会产生错误。
- 您可以通过执行Number(true)和Number('true')来查看转换。
- @那么,等等,你在javascript中告诉我,if(x)可以计算为真,而if(x == true)可以计算为假?奥欧
- 对。只有当且仅当x是true或1时,它才评估为true。如果要检查x的真实性,只需使用if (x) {...,或者如果要使用boolean,则使用!!x。
- 对不起,x也可以是"1"。
- @麦克哈特感谢你的明确回答。当我试图弄清楚为什么if("true")起作用,但if("true" == true)失败时,我发现了这个问题。这似乎是处理类型转换的一种奇怪的方法——如果一个是布尔值,我宁愿把它们转换成布尔值,而不是尝试转换成数字(在本例中是NaN)。
- 好吧,我明白,但你能解释一下为什么'true'?1:0给出1,NaN?1:0给出0吗?
=ECMA 5中定义的比较运算符为
如果type(x)是数字,type(y)是字符串,返回比较结果x==t编号(y)。
如果类型(x)是字符串,类型(y)是数字,
如果类型(x)是布尔值,则返回比较结果tonumber(x)==y。
如果类型(y)是布尔值,则返回比较结果x==tonumber(y)。
因此,"true"==true由JS引擎解释为
"真"=t编号(真)
"真"=1
t编号("真")==1
Na=1
==>假
根据抽象的等式比较算法
http://www.ecma-international.org/ecma-262/5.1/sec-11.9.3
如果其中一个oprends是布尔值,而另一个不是,则布尔值将转换为数字0或1。所以true =="true"是假的。
- 我是按以下方式推断的吗?"true"==true变为"true"==1,然后变为"true"==1",这就是它们返回false的原因?