【问题标题】: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 如下:

  1. 它们是同一类型吗? 没有
  2. 操作数是数字还是布尔值? 是的
  3. 我们可以将两者都转换为数字吗? (isNaN(Number("true")) // true)
  4. 任一操作数都是字符串吗? 是的
  5. 我们可以将另一个操作数转换为字符串吗? 是的 (String(true) === "true" // true)

我得到了字符串 "true""true",它们的计算结果应该为 true,但 JavaScript 显示为 false。

我错过了什么?

【问题讨论】:

  • 有这么多 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

标签: javascript string equals


【解决方案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

  1. 如果Type(x) 是数字并且Type(y) 是字符串,
    返回比较结果 x == ToNumber(y)。
  2. 如果Type(x) 是字符串且Type(y) 是数字,
    返回比较结果ToNumber(x) == y。
  3. 如果Type(x) 为布尔值,则返回比较结果ToNumber(x) == y。
  4. 如果Type(y) 是布尔值,则返回比较结果x == ToNumber(y)。

因此,"true" == true 被评估为:

  1. "true" == ToNumber(true)   (通过规则 7)
  2. “真”== 1
  3. ToNumber("true") == 1   (通过规则 5)
  4. 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-17
        • 1970-01-01
        • 2015-10-03
        • 2017-07-29
        • 2021-10-19
        • 2019-12-07
        相关资源
        最近更新 更多