JavaScript为什么true不和双等号'=='匹配?

6

这段代码的问题长时间未被发现。

我曾认为只要执行以下操作,就不会出现问题。

if('true' == true) {
    alert("Does not happen");
}

但是它没有通过if条件。

我认为双等号==匹配的是值而不是类型,因为匹配类型的工作是===的任务。

现在我的问题是为什么true没有被强制转换为'true',或者为什么它要检查这些操作数的类型?


"true" 是字符串,true 是布尔类型,即字符串 == 布尔类型。 - Krish R
4个回答

8
'true' == true

这里发生的情况如下(根据规则):
-- 将布尔值转换为数字(规则7):
'true' == 1

-- 将'true'转换为数字(规则5):

Number('true') == 1

-- Number('true')NaN

NaN == 1

-- 返回false (规则1.c.i) ==确实令人困惑,但一旦了解规则,它就有些意义:
  • 垃圾等于垃圾(undefined == null)
  • 没有布尔值(它们被视为数字进行比较)
  • 如果其中一个部分是数字,则比较数字
  • 如果其中一个部分是字符串,则按字符串进行比较
  • 否则,a和b必须是相同的东西。
请注意保留HTML标记。

2
到目前为止,这是最好(也是最简单)的解释! - musefan

4

JavaScript的==是语言中最糟糕的部分之一,它没有可理解的逻辑基础...我们遭受着一个旧规范,那就是答案。

看一眼完整的“Facepalm”:

https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Sameness

编辑的补充

是的,“类型转换”并没有像我们期望的那样工作...没有其他答案...:/


在我看来,这并没有回答问题。两个操作数的转换恰好遵循规范,应该接受thg435的答案。 - Alnitak

4
请参阅“==”规则Type(x)是一个字符串,Type(y)是一个布尔值。因此,应用步骤7。它将布尔值转换为数字并将其与字符串进行比较。你所拥有的字符串不会匹配任何数字。

我不认为这个算法在这里是这样工作的。正确的步骤顺序是7-5-1.c.i. - georg
@thg435 — 哎呀!我错过了 Type(y),因为里面有那么多的 Type(x) - Quentin

1

在JavaScript中,布尔值如果为真,则结果为1。如果参数为假,则结果为+0。因此,'true' == true等同于'true' == 1,当然是错误的。


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