【问题标题】:Why does not the true match 'true' with double equals sign '==' in JavaScript? [duplicate]为什么在 JavaScript 中 true 与双等号 '==' 不匹配? [复制]
【发布时间】:2014-01-29 06:24:25
【问题描述】:

这小部分代码花了很长时间才被注意到。

我想如果我执行以下操作就可以了

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

但它没有通过 if 条件。

我认为双精度等于 == 匹配值而不是类型,因为匹配类型是 === 的工作。

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

【问题讨论】:

  • 'true' 是字符串,true 是布尔值,即字符串 == 布尔值

标签: javascript if-statement casting


【解决方案1】:
'true' == true

这就是这里发生的事情(根据rules):

-- 将布尔值转换为数字(规则 7):

'true' == 1

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

Number('true') == 1

-- Number('true')NaN:

NaN == 1

-- 返回 false(规则 1.c.i)

== 确实让人迷惑,但理解了规则就有些道理了:

  • 垃圾等于垃圾(未定义 == null)
  • 没有布尔值(它们作为数字进行比较)
  • 如果其中一个部分是数字,则比较数字
  • 如果其中一个部分是字符串,则作为字符串进行比较
  • 否则,a 和 b 必须是同一个东西。

【讨论】:

  • 迄今为止最好(也是最简单)的解释!
【解决方案2】:

Javascript 的== 是该语言中最糟糕的部分之一,它是在无法理解的逻辑下构建的......我们遇到了一个旧规范,这就是答案。

在完整的 Facepalm 中掠夺:

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

编辑编辑

是的,'typecast' 没有像我们预期的那样工作......没有其他答案......:/

【讨论】:

  • 恕我直言,这不能回答问题。两个操作数的转换完全遵循规范,应该接受 thg435 的回答。
【解决方案3】:

请参阅rules for ==

Type(x) 是一个字符串,Type(y) 是一个布尔值。所以第 7 步适用。它将布尔值转换为数字并将其与字符串进行比较。你得到的字符串不会匹配任何数字。

【讨论】:

  • 我不认为这就是这个算法在这里的工作方式。正确的步骤顺序是 7-5-1.c.i.
  • @thg435 — 啊!我错过了Type(y) 里面的所有Type(x)s。
【解决方案4】:

在 JavaScript 布尔值中,如果参数为真,则结果为 1。如果参数为假,则结果为 +0。所以,'true' == true 等价于 'true' == 1,当然是假的。

【讨论】:

    猜你喜欢
    • 2015-07-17
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多