【问题标题】:Why does true == 'true' statement in JS return false? [duplicate]为什么JS中的true == 'true'语句返回false? [复制]
【发布时间】:2013-11-10 12:44:38
【问题描述】:

问题在标题中。我刚刚尝试在 Chrome 控制台中运行下一条语句,结果很奇怪(就我而言):

true == 'true' // returns false
'true' == true // returns false

为什么会这样?为什么类型转换在那里不起作用,但在下一个语句中起作用?

if ('true') true // returns true

【问题讨论】:

标签: javascript


【解决方案1】:

因为它们不代表同样可转换的类型/值。 == 使用的转换比if ('true') 使用的简单toBoolean 转换复杂得多。

所以给定这个代码true == 'true',它会找到这个:

“如果Type(x)Boolean,返回比较结果ToNumber(x) == y。”

所以你看到它开始变成ToNumber(true) == 'true',也就是1 == 'true',然后再试一次,它现在找到了:

如果Type(x)Number 并且Type(y)String,则返回比较结果x == ToNumber(y)

所以现在它正在执行1 == ToNumber('true'),即1 == NaN,当然是false

【讨论】:

  • +1 解释得很好!您能否链接该信息的来源?
  • @PhilippSander:使用 Rocket 的链接。这是一个非官方的副本,但有很好的交叉链接和注释。这就是抽象等式比较算法
【解决方案2】:

true 是一个布尔值 'true' 是一个字符串。

您正在比较不同的数据类型。 look here: http://w3schools.com/js/js_datatypes.asp

【讨论】:

  • javascript 在使用 == 但不使用 === 时转换类型
  • 哦,拜托。很多仇恨。但是 w3 确实帮助我回到了使用 javascript 的日子。他们从未试图成为“规范”。只是一种让人们前进的简单方法。在任何学校里,你总是为了理解而把事情过分简单化,然后再把“真相”呈现出来。
  • @AwokeKnowing 也许但是您认为 SO 用户期望什么?我敢打赌不是你所说的“真相”。 MDN 100500 倍更好的参考。他们终于有了自己的浏览器和 JS 引擎,而 w3fools 没有。
  • @antyrat:曾经有一段时间 w3fools 有观点,但他们现在最大的论点是 w3schools 没有被维基化,因此没有以超音速更新:) 他们确实有一个论坛和建议方法,这是他们以前没有的。与其要求他们进行 wikify,不如让其他网站提供该选项.... 哦,等等,其他人已经尝试过,并且已经被 w3schools 黯然失色,这通常是 95% 的准确率,如果你可以谷歌搜索其他 5% 或来到 SO需要帮助。
【解决方案3】:

true = 布尔类型

'true' = 字符串类型

表达式 "if ('true')" 以与 if('foo') 或任何其他字符串相同的方式将 'true'(string) 评估为 true(boolean)。

【讨论】:

    【解决方案4】:

    非空字符串将返回 true:

    • if ('0') true; // true
    • if ('false') true; // true
    • if ('anything') true; // true

    一个空字符串将返回未定义,因此是 falsy

    • if ('') true; // not true

    当比较类型时,JavaScript 会尝试为你做一些魔法:

    • if (1 == "1") true; // true

    但是将字符串转换为布尔值时失败:

    • if(true == "true") true; // not true

    【讨论】:

      【解决方案5】:

      == 运算符使用 ECMAScript 的 abstract equality algorithm,这非常复杂。它的确切行为取决于所涉及的每个参数的类型,并且每个步骤通常涉及另一个调用另一个 ECMAScript 函数。

      if(condition) 语句使用 ECMAScript 的 ToBooleancondition 转换为布尔值,这很简单,可以在单个表中表示。正如您在规范中看到的那样,如果字符串的长度不为零,则任何字符串都是真实的(根据ToBoolean)。

      【讨论】:

        猜你喜欢
        • 2021-11-10
        • 1970-01-01
        • 2015-05-06
        • 2019-02-08
        • 2015-10-03
        • 2015-06-22
        • 1970-01-01
        • 2017-07-29
        • 1970-01-01
        相关资源
        最近更新 更多