“==”的对象相等的标准定义是什么?

时间:2011-08-29 11:12:03

标签: javascript types operators type-conversion

似乎是对==的共同理解与其实际行为之间的不匹配。为这个问题提供一些背景知识:

typeof new Number(1); // returns object
typeof new String(1); // returns object
typeof 1;             // returns number

似乎NumberString都属于object类型。这并不奇怪。然而,对于==而言,当操作数等于 >时,true会返回==

根据a somewhat authorative description

  

运营商试图   将对象转换为原始值,String或Number值,   使用对象的valueOf和toString方法。如果这样做   要转换对象失败,会生成运行时错误。

简而言之,var numa = new Number(1); var numb = new Number(1); var stri = new String(1); numa.toString() == stri.toString(); // returns true, as expected numa.valueOf() == stri.valueOf(); // returns true, as expected numa == stri; // returns false (?!) numa == numb; // returns false (?!!!) numa == numa; // returns true, as expected var numx = 1; numa == numx; // returns true (?) numb == numx; // returns true (?) stri == numx; // returns true (?) 应该按原始值比较对象。令人惊讶的:

==

当两个操作数都是对象时,toString()运算符既不会使用valueOf()也不会使用==,而是会显示其他内容。

{{1}}的对象平等的标准定义是什么?

2 个答案:

答案 0 :(得分:5)

我相信你在那里看到的,以及“有点权威的描述”中遗漏的是==尝试将对象转换为基元,只有当它的比较是原始的时候。如果两个操作数都是对象,则将它们作为对象进行比较,并且只有当它们是同一个对象时,相等性测试才为真(即相同的实例 - 具有相同属性的不同对象不同,如您在{{1}中看到的那样} case)。

答案 1 :(得分:3)

简而言之,当操作数是对象时,==会比较引用。

来自official specification,第80页:

  

11.9.3抽象等式比较算法

     
      
  • 如果Type(x)与Type(y)相同,那么

         

    a - e省略,因为不适用于对象

         

    <强> F。如果x和y引用同一个对象,则返回true。   否则,返回false。

  •