Javascript “对象相等”的标准定义是什么==&引用;?

Javascript “对象相等”的标准定义是什么==&引用;?,javascript,types,operators,type-conversion,Javascript,Types,Operators,Type Conversion,对=的普遍理解与它的实际功能之间似乎存在不匹配。为说明该问题的一些背景: typeof new Number(1); // returns object typeof new String(1); // returns object typeof 1; // returns number 看起来,Number和String都属于object类型。这并不奇怪。然而,对于=来说,事情变得有趣起来,当操作数等于时,无论其类型如何,它都应该返回true 根据: 运营商试图 将对

=
的普遍理解与它的实际功能之间似乎存在不匹配。为说明该问题的一些背景:

typeof new Number(1); // returns object
typeof new String(1); // returns object
typeof 1;             // returns number
看起来,
Number
String
都属于
object
类型。这并不奇怪。然而,对于
=
来说,事情变得有趣起来,当操作数等于时,无论其类型如何,它都应该返回
true

根据:

运营商试图 将对象转换为基本值、字符串或数字值, 使用对象的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抽象等式比较算法

  • 如果类型(x)与类型(y)相同,则

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

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


我的假设大致相同。然而,我不太明白JavaScript到底在比较什么。它使用哪个标识符?该标识符是否可以通过某种方式从“外部”访问,例如通过
console.log
?@Saul:我希望它比较的是分配对象的内存地址或JS引擎内部的ID。我不知道有任何JS控制台可以使用它;它通常被视为“您不需要知道”信息。
==
不是严格的平等。问题表明,当两个操作数都是对象时,JavaScript既不使用
valueOf()
也不使用
toString()
。严格相等意味着值相等和类型相等
new Number(1)。valueOf()==new Number(1)。valueOf()
返回
true
,这意味着操作数的值相等<代码>新编号(1)编号实例还返回
true
,根据定义,这意味着操作数具有相同的类型。但是,
=
仍然失败。因此就有了关于对象相等的标准定义的问题。请看一下更新。这是您的标准定义。从这一点你可以看到,如果两个操作数都是对象,那么对象就不会被转换。太好了,这就是我要找的。@Saul:所以我告诉你同样的事情,首先,有更多的反馈,这个答案得到了接受,因为它引用了一个规范。多么令人恼火的维基百科风格。为什么要投票?答案是“阅读规范”。@Tim Down:大多数技术问题归结为“阅读规范”,不用说。不必勉强。我的意思是,这么做的全部目的不是为了得到专家的答案——以换取乐趣和利润吗?在你问“标准定义”是什么的时候,真的没有别的地方可去了。任何与规范无关的答案都将是不精确的,或者使用非标准术语。我想答案中可能有一些价值,用一些人觉得更容易理解的术语解释了规范。