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

What is the standard definition of object equality for "=="?

本文关键字:定义 是什么 标准 quot 对象      更新时间:2023-09-26

似乎在对==的普遍理解和它的实际功能之间存在不匹配。为这个问题提供一些背景信息:

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

从表面上看,NumberString均为object型。这并不奇怪。然而,==的事情变得有趣了,当操作数等于时,无论是什么类型,它都应该返回true

根据有点权威的描述:

操作符尝试将对象转换为基本值、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(),而是使用其他东西。

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

我相信您在那里看到的,以及"有点权威的描述"中遗漏的内容是,==试图将对象转换为原始值,当且仅当其比较对象是原始值时。如果两个操作数都是对象,则将它们作为对象进行比较,并且只有当它们是相同的对象(即相同的实例-具有相同属性的不同对象不同,如您在numa == numb案例中看到的那样)时,相等性测试才为真。

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

来自官方规范,第80页:

11.9.3抽象相等比较算法
  • 如果Type(x)与Type(y)相同,则

    省略

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

    f。如果x和y引用同一对象,则返回true。