似乎是对==
的共同理解与其实际行为之间的不匹配。为这个问题提供一些背景知识:
typeof new Number(1); // returns object
typeof new String(1); // returns object
typeof 1; // returns number
似乎Number
和String
都属于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}}的对象平等的标准定义是什么?
答案 0 :(得分:5)
我相信你在那里看到的,以及“有点权威的描述”中遗漏的是==
尝试将对象转换为基元,只有当它的比较是原始的时候。如果两个操作数都是对象,则将它们作为对象进行比较,并且只有当它们是同一个对象时,相等性测试才为真(即相同的实例 - 具有相同属性的不同对象不同,如您在{{1}中看到的那样} case)。
答案 1 :(得分:3)
简而言之,当操作数是对象时,==
会比较引用。
来自official specification,第80页:
11.9.3抽象等式比较算法
如果Type(x)与Type(y)相同,那么
a - e省略,因为不适用于对象
<强> F。如果x和y引用同一个对象,则返回true。 否则,返回false。