这段代码的问题长时间未被发现。
我曾认为只要执行以下操作,就不会出现问题。
if('true' == true) {
alert("Does not happen");
}
但是它没有通过if条件。
我认为双等号==
匹配的是值而不是类型,因为匹配类型的工作是===
的任务。
现在我的问题是为什么true
没有被强制转换为'true'
,或者为什么它要检查这些操作数的类型?
这段代码的问题长时间未被发现。
我曾认为只要执行以下操作,就不会出现问题。
if('true' == true) {
alert("Does not happen");
}
但是它没有通过if条件。
我认为双等号==
匹配的是值而不是类型,因为匹配类型的工作是===
的任务。
现在我的问题是为什么true
没有被强制转换为'true'
,或者为什么它要检查这些操作数的类型?
'true' == true
'true' == 1
-- 将'true'转换为数字(规则5):
Number('true') == 1
-- Number('true')
是 NaN
:
NaN == 1
==
确实令人困惑,但一旦了解规则,它就有些意义:
JavaScript的==
是语言中最糟糕的部分之一,它没有可理解的逻辑基础...我们遭受着一个旧规范,那就是答案。
看一眼完整的“Facepalm”:
https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Sameness
编辑的补充
是的,“类型转换”并没有像我们期望的那样工作...没有其他答案...:/
Type(y)
,因为里面有那么多的 Type(x)
。 - Quentin在JavaScript中,布尔值如果为真,则结果为1。如果参数为假,则结果为+0。因此,'true' == true
等同于'true' == 1
,当然是错误的。
true
是布尔类型,即字符串 == 布尔类型。 - Krish R