如何理解表达式“{} == true”?

时间:2015-12-30 08:43:19

标签: javascript

我尝试理解文档Ecma-262{} == true部分后面的7.2.12表达式。

  
      
  1. 如果Type(y)为布尔值,则返回比较结果x == ToNumber(y)
  2.   

ToNumber(true)的结果是1,然后是

{} == 1

  
      
  1. 如果Type(x)是Object而Type(y)是String,Number或Symbol,那么   返回比较结果ToPrimitive(x) == y
  2.   

我现在对ToPrimitive({})感到困惑。

  
      
  1. 如果提示是“字符串”,那么

         

    一个。让methodNames为«“toString”,“valueOf”»。

  2.   
  3. 否则,

         

    一个。让methodNames为“”valueOf“,”toString“»。

  4.   

ToPrimitive({})应该被解释为{}.toString()还是{}.valueOf()

假设调用了toString()

  

如果Type(x)是String而Type(y)是Number,   返回比较结果ToNumber(x) == y

所以{} == true可能是ToNumber(ToPrimitive({})) == ToNumber(true)

2 个答案:

答案 0 :(得分:15)

spec说:

  

在没有提示的情况下调用ToPrimitive时,它通常表现为提示为数字。

因此,根据ToPrimitive算法,首先调用valueOf。但是因为它返回一个对象而不是一个原始值,toString将被调用为second,它将返回一个字符串。

  

所以{} == true可能是ToNumber(ToPrimitive({})) == ToNumber(true)

是的,这就是它的本质。

答案 1 :(得分:7)

ToPrimitive({})首先评估为{}.valueOf()。由于valueOf()会返回对象本身,因此会使用toString()方法 {}.toString()返回"[object Object]",与1进行比较。 "[object Object]"转换为NaN并与1进行比较 现在操作数与Number类型相同,并使用===运算符。 NaN === 1评估为false

形式上:

  1. {} == true(将true转换为Number - > 1
  2. {} == 1(使用valueOf()转换{},然后toString() - > "[object Object]"
  3. "[object Object]" == 1(将"[object Object]"转换为Number - > NaN
  4. NaN == 1(由于操作数类型相同,将运算符更改为===
  5. NaN === 1
  6. false
  7. 更新:查看我的帖子The legend of JavaScript equality operator,了解更多详情和示例。