=="的对象相等的标准定义是什么?
What is the standard definition of object equality for "=="?
似乎在对==
的普遍理解和它的实际功能之间存在不匹配。为这个问题提供一些背景信息:
typeof new Number(1); // returns object
typeof new String(1); // returns object
typeof 1; // returns number
从表面上看,Number
和String
均为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。
相关文章:
- 如果 JS 中的函数是一流的,那么在定义它们之前允许调用它们是什么
- 为Google闭包类定义属性的首选方式是什么
- 定义js函数时冒号的含义是什么
- 什么'获取数组的已定义部分的最快方法是什么?JS
- 在jQuery方法中编写自定义属性的正确语法是什么
- 检查链接对象形式中未定义属性的最佳实践是什么
- 当生成正态分布的随机值时,定义范围的最有效方法是什么
- 使用方法和属性定义javascript对象的最佳方法是什么?(如果可能以本机方式)
- 在 aurelia 中使用 repeat.for 绑定自定义元素的正确方法是什么
- JavaScript 中全局范围内存在未定义变量的原因是什么?
- 在 popState 定义的上下文中,浏览器活动历史记录的含义是什么?
- 在ES2015中定义一个类,构造函数方法是什么以及为什么它是必不可少的
- ECMAScript 中的内部属性定义是为了什么
- 当未定义默认导出时,从“模块”导入模块是什么,为什么它与将 * 导入为模块不同
- 在主干模型中定义实例变量的正确方法是什么
- 在循环中定义函数的最佳方法是什么?- JavaScript
- 由“var”全局定义的变量是什么范围
- 此数据的格式是什么?是自定义格式吗?
- 递归的定义是什么
- =="的对象相等的标准定义是什么?