在对象为boolean的情况下,如何在Javascript中键入Coercion?

时间:2012-06-29 15:49:55

标签: javascript type-conversion

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

然而,当我试图测试时,我开始得到一些非常奇怪的行为。

例如:

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

此外

false == undefinedtrue == undefined都返回false,

也是如此

false == Infinitytrue == Infinity以及

false == NaNtrue == NaN

这到底发生了什么?

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

3 个答案:

答案 0 :(得分:6)

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

对于false == []

的情况
  • false被转换为数字(0),因为这总是用布尔值来完成。
  • []通过调用[].valueOf().toString()转换为基元,这是一个空字符串。
  • 然后通过将空字符串转换为数字来计算
  • 0 == "",并且因为结果也为0,false == []为真。

对于false == ![]

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

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

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

另外两种情况的评估方式相同:第一个布尔值为Number,然后将其与另一个数字进行比较。由于0和1都不等于无穷大或不是数字,因此这些表达式也会计算为false

答案 1 :(得分:1)

摘要相等算法在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。
  7. 重复算法,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。

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

答案 2 :(得分:0)

false == []

使用==允许Javascript应用转化。该对象将转换为与布尔匹配类型的基元,留下空字符串。 false将转换为数字0.比较空字符串和数字0.字符串将转换为0的数字,因此表达式为“true”

![]

Javascript将对象转换为布尔值true,因此拒绝true结尾为假。

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

再次有点相同! false被转换为0,true为1.然后,undefined被转换为一个数字...... NaN!在任何情况下都是假的

除非您非常了解自己在做什么,否则我建议您尽可能多地使用=== !==来获得“预期”结果。使用像Boolean(undefined) == fals e这样的东西也会很好。

检查ECMAScript规范,了解转换内容时的所有细节。