为什么 false == "false" 是错误的?

11

我仍在学习JavaScript的基础知识,不明白为什么会发生这种情况。

当类型强制转换 false == "false" 时,会被转换为:

false == false //true
或者
"false" == "false" //true
所以,为什么 false == "false" 是假的呢?

7
因为它们中的一个是布尔值,另一个是字符串。 - Gerardo Furtado
谢谢:):) 我刚尝试了 true == "true",结果为 false。回答非常快:) - viery365
数据类型不同,一个是布尔类型,一个是字符串类型。 - Farrukh Faizy
1
@viery365,请查看这里的第二个表格(基本上是Quentin的答案):https://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/ - Gerardo Furtado
@GerardoFurtado 谢谢 :) 表格非常好 :) - viery365
@GerardoFurtado 您的评论并不正确。==尝试执行类型转换...因此说“一个是字符串,另一个是布尔值”在这里并不是真正的情况。恰好发生的是,在最终结果中,类型转换不等价。 - Kellen Stuart
4个回答

28

你误解了类型转换规则。在比较之前,false 不会被转换为字符串。

如果x的类型是Boolean,则返回 ToNumber(x) == y 的比较结果。

false 被转换为一个数字,计算结果如下:

+0 == "false"

如果x的类型为数字且y的类型为字符串,则返回比较结果x == ToNumber(y)。

...然后将"false"转换为数字,得到:

+0 == NaN

...这是错误的。


1
这就是我在寻找的答案。我必须更好地理解类型强制规则。当然,我一直在考虑使用 ===,但我需要理解这个问题。谢谢:) 我会在几分钟内接受答案。 - viery365
2
因此 false === "0" 将导致为真。 - sahaj
@sahaj 谢谢!:) 是的,现在我明白了:) - viery365
4
@sahaj - 使用===不会这样。 - nnnnnn
3
抱歉打错字了,请原谅。应该是==。即false == "0"将得到true。 - sahaj
显示剩余4条评论

5
答案是因为“false”是一个字符串(正如Gerardo Furado在评论中指出的那样),你所做的测试相当于false = "hello"。
Javascript不会查看字符串中的单词来确定它是否为布尔值,然后尝试从中获取值。
注意:
通常在javascript中,最好使用===运算符,以避免所有这些问题。

1
false == "false" // false

因为布尔值false会被转换成0,所以我们将0与"false"进行比较,输出结果为false。

-4

这些是不同类型的项目。

"string"boolean

所以:

false.toString() == "false"

无论右侧的字符串是什么,使用双等号将始终为真。 - stringVector

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接