【问题标题】:How does Type Coercion in Javascript in the case of object to boolean?在对象为布尔值的情况下,Javascript 中的类型强制如何?
【发布时间】:2012-07-01 04:09:35
【问题描述】:

据我所知,(x == false) 应该与 !x 做同样的事情,因为他们都试图将 x 解释为布尔值,然后否定它。

但是,当我尝试对此进行测试时,我开始出现一些非常奇怪的行为。

例如:

false == []false == ![] 都返回 true。

另外

false == undefinedtrue == undefined 都返回 false,也一样

false == Infinitytrue == Infinity

false == NaNtrue == NaN

这里到底发生了什么?

http://jsfiddle.net/AA6np/1/

【问题讨论】:

  • === 得到相同的结果吗?
  • false == []可以解释为[].toString() == ""false == ""
  • 无论如何,听起来你好像相信,如果false == undefined 返回false,那么true == undefined 应该返回true,但实际上为什么这些比较应该返回任何有意义的东西呢?
  • @RobertHarvey 它没有,这是一个学术练习。显然,任何写 if(![] == false) 的人都应该被解雇。
  • @RobertKoritnik:是的,这个问题是反问的。

标签: javascript type-conversion


【解决方案1】:

都在这里:http://es5.github.com/#x11.9.3

对于false == []的情况:

  • false 被转换为数字 (0),因为它总是使用布尔值完成。
  • [] 通过调用[].valueOf().toString() 转换为原语,是一个空字符串。
  • 0 == "" 然后通过将空字符串转换为数字来评估,因为结果也是 0,所以 false == [] 为真。

对于false == ![]的情况:

  • logical not operator ! 是通过返回 ToBoolean(GetValue(expr)) 的反面来执行的
  • ToBoolean() 对于任何对象始终为真,因此![] 的计算结果为false(因为!true = false),因此false == ![] 也为真。

(false == undefined) === false(true == undefined) === false 更简单:

  • falsetrue 再次转换为数字(分别为 0 和 1)。
  • 由于 undefined 无法与数字进行比较,因此链会冒泡到默认结果,即 false

其他两种情况的评估方式相同:首先将布尔值转换为数字,然后将其与另一个数字进行比较。由于 0 和 1 都不等于 Infinity 或不是数字,因此这些表达式的计算结果也为 false

【讨论】:

    【解决方案2】:

    section 9.3 of the specification 中描述了抽象相等算法。

    对于x == y,其中 x = false 和 y = []

    1. 不。类型不相等。
    2. 不,x 不为空。
    3. 不。 x 不是未定义的。
    4. 不,x 不是数字
    5. 不,x 不是字符串。
    6. 是的,x 是一个布尔值,所以我们比较 ToNumber(x) 和 y。

    重复算法,x=0 和 y=[]
    我们在第 8 步结束:Type(x) == number。和类型(y)==对象。
    所以,让结果是 x == ToPrimitive(y)。
    ToPrimitive([]) == ""

    现在,使用 x=0 和 y="" 再次重复该算法。我们在 4 结束:“返回比较结果 x == ToNumber(y)。”
    ToNumber("") == 0

    算法的最后一次重复在第 1 步结束(类型相等)。通过 1.c.iii,0 == 0,返回 true。

    通过使用该算法,可以以类似的方式获得其他结果。

    【讨论】:

      【解决方案3】:
      false == []
      

      允许使用== Javascript 应用转换。该对象将转换为原始类型以与布尔值匹配,留下一个空字符串。 false 将转换为数字 0。将空字符串与数字 0 进行比较。字符串转换为数字 0,因此表达式为“true”

      ![]
      

      Javascript 将对象转换为布尔值 true,因此否认 true 结束为 false。

      false == undefined true == undefined
      false == Infinity and true == Infinity
      false == NaN and true == NaN
      

      又是一样的! false 转换为 0,true 转换为 1。然后, undefined 转换为一个数字,即...... NaN!无论如何都是假的

      我建议尽可能多地使用=== !== 以获得“预期”结果,除非您非常清楚自己在做什么。使用Boolean(undefined) == false 之类的东西也不错。

      在转换内容时检查 ECMAScript 规范以获取所有详细信息。

      【讨论】:

        猜你喜欢
        • 2015-12-17
        • 2022-01-18
        • 1970-01-01
        • 2011-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-27
        • 2016-05-19
        相关资源
        最近更新 更多