为啥 "true" == true 在 JavaScript 中显示为 false?
Posted
技术标签:
【中文标题】为啥 "true" == true 在 JavaScript 中显示为 false?【英文标题】:Why does "true" == true show false in JavaScript?为什么 "true" == true 在 JavaScript 中显示为 false? 【发布时间】:2012-07-06 23:57:49 【问题描述】:MDC describes the ==
operator as follows:
如果两个操作数的类型不同,javascript 会转换操作数,然后应用严格比较。如果任一操作数是数字或布尔值,则尽可能将操作数转换为数字;否则,如果任一操作数是字符串,则尽可能将另一个操作数转换为字符串。
考虑到这一点,我将评估"true" == true
如下:
-
它们是同一类型吗? 没有
操作数是数字还是布尔值? 是的
我们可以将两者都转换为数字吗? 否 (
isNaN(Number("true")) // true
)
任一操作数都是字符串吗? 是的
我们可以将另一个操作数转换为字符串吗? 是的 (String(true) === "true" // true
)
我得到了字符串 "true"
和 "true"
,它们的计算结果应该为 true
,但 JavaScript 显示为 false。
我错过了什么?
【问题讨论】:
相关: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")
---> "no yes"
我得说,我很惊讶,发生这种情况真是太愚蠢了。始终始终使用 === 的另一个原因
@user1068352 检查混乱 :) dorey.github.io/JavaScript-Equality-Table
【参考方案1】:
因为"true"
转换为NaN
,而true
转换为1
。所以它们是不同的。
正如您所报告的,两者都被转换为数字,因为至少true
可以(参见 Erik Reppen 的评论),然后进行比较。
【讨论】:
你能告诉我这一步Can we convert both to a number?
什么时候会是假的吗?如果NaN
是一个数字,这一步怎么会失败?
非此即彼。如果两者都会导致 NaN,他们将切换到字符串评估。如果只能转换一个,还有一个数字比较。
Javascript 中实际上有一些奇怪的对象,它们的行为非常奇怪。例如,IE
您可以通过Number(true)
和Number('true')
自己查看转化情况【参考方案2】:
==
比较运算符是defined in ECMA 5:
-
如果Type(x) 是数字并且Type(y) 是字符串,
返回比较结果 x == ToNumber(y)。
如果Type(x) 是字符串且Type(y) 是数字,
返回比较结果ToNumber(x) == y。
如果Type(x) 为布尔值,则返回比较结果ToNumber(x) == y。
如果Type(y) 是布尔值,则返回比较结果x == ToNumber(y)。
因此,"true" == true 被评估为:
-
"true" == ToNumber(true) (通过规则 7)
“真”== 1
ToNumber("true") == 1 (通过规则 5)
NaN == 1
===> 错误
【讨论】:
【参考方案3】:根据抽象等式比较算法
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3
如果其中一个 oprend 是布尔值而另一个不是,则布尔值将转换为数字 0 或 1。所以 true == "true"
为 false。
【讨论】:
我的推断是否正确? "true" == true 变成 "true" == 1 然后变成 "true" == "1" 这就是他们返回 false 的原因?【参考方案4】:相等运算符(==
和!=
)使用Abstract Equality Comparison Algorithm 比较两个操作数。
"true" == true
由于"true"
是String
,true
是Boolean
,我们需要返回"true" == Number(true)
的结果(算法中的步骤7
),即"true" == 1
。
"true" == 1
由于"true"
是String
和1
是Number
,我们需要返回Number("true") == 1
的结果(算法中的步骤5
)。 Number("true")
返回NaN
。
现在我们有NaN == 1
。
NaN == 1
现在两个操作数属于同一类型 (Number
)。
根据算法,如果两个操作数都是Number
,其中一个是NaN
,则返回false
(算法中的步骤1.c.i
)。
【讨论】:
【参考方案5】:解释考虑场景 true == "true"。 上面直接返回false,然而,我们的预期是true JavaScript使用抽象等式比较算法,所以根据算法
true == "true"
// If one of the operands is Boolean, convert the Boolean operand to 1 if it is true and +0 if it is false
ConvertToNumber(true) == "true"
1 == "true"
// When the algorithm finds the above statements, it thinks that it needs to do one more conversion -
// "When comparing a number to a string, try to convert the string to a numeric value"
1 == ConvertToNumber("true)
1 == NaN
// Which returns false
【讨论】:
以上是关于为啥 "true" == true 在 JavaScript 中显示为 false?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 "abcd".StartsWith("") 返回 true?
为啥使用 draggable="true" 拖动时不显示 div 的内容?
为啥 IsNumeric("1.23D45") 返回 True?
Python:为啥 ("hello" is "hello") 评估为 True? [复制]
Python:为啥 ("hello" is "hello") 评估为 True? [复制]
document.getElementById(printTitle).innerHTML,为啥含有<tr>显示不出来呢