为啥 "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"StringtrueBoolean,我们需要返回"true" == Number(true)的结果(算法中的步骤7),即"true" == 1

"true" == 1

由于"true"String1Number,我们需要返回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>显示不出来呢