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

Han*_*s Z 4 javascript type-conversion

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

但是,当我试图测试时,我开始得到一些非常奇怪的行为.

例如:

false == []并且false == ![]都返回true.

另外

false == undefined并且true == undefined两者都返回false,就像那样

false == Infinitytrue == Infinity

false == NaNtrue == NaN.

到底发生了什么?

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

Nik*_*iko 6

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

对于以下情况false == []:

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

对于以下情况false == ![]:

  • 逻辑非运算符!通过返回的相对执行ToBoolean(GetValue(expr))
  • ToBoolean()对于任何对象总是如此,因此![]求值为false(因为!true = false),因此false == ![]也是如此.

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

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

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