【发布时间】:2011-11-05 22:58:19
【问题描述】:
似乎对== 的普遍理解与其实际作用不匹配。为这个问题提供一些背景:
typeof new Number(1); // returns object
typeof new String(1); // returns object
typeof 1; // returns number
看起来Number 和String 都属于object 类型。那里并不奇怪。然而,== 的事情变得有趣了,当操作数不管它们的类型相等时,它应该返回 true。
据a somewhat authorative description:
运营商试图 将对象转换为原始值、字符串或数字值, 使用对象的 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(),而是使用其他东西。
== 对象相等的标准定义是什么?
【问题讨论】:
-
为什么要投赞成票?答案是“阅读规范”。
-
@Tim Down:大多数技术问题都归结为“阅读规范”,不用说。没必要吝啬。我的意思是,SO 的全部意义不在于获得专家的答案——以换取乐趣和利润吗?
-
当您询问“标准定义”是什么时,真的无处可去。任何不参考规范的答案都将是不精确的或使用非标准术语。我想在一些人认为更容易理解的术语中解释规范的答案可能有一些价值。
标签: javascript types operators type-conversion