2016-04-28 65 views
2

这可能只是JavaScript的一个奇怪的怪癖,但我很好奇,如果有人知道为什么发生这种情况:为什么对象大于/小于或等于不同的对象?

({} <= {}) => true

({} >= {}) => true

({} == {}) => false

({} === {}) => false

({} > {}) => false

({} < {}) => false

为什么前两个假设所有其他人都是假的?

我认为它可以比较前铸造的对象号码,但...

Number({}) >= Number({}) => false

+0

类型转换的规则在'=='和'<='/'> ='之间是不同的。 – Pointy

+2

你可以阅读[this](http://www.ecma-international.org/ecma-262/5.1/#sec-11.8.5)关于大于和小于,[this](http:/ /www.ecma-international.org/ecma-262/5.1/#sec-11.9.3)关于'=='。 – Pointy

回答

2

使用</<=/>/>=运营商在ES5采用了Abstract Relational Comparison Algorithm,这是一个奇特的说比较它们之前强制类型的方式。当{}被强制[[ToPrimitive]]时,它回落到toString()方法,这两个方法返回"[object Object]"。因为小于/大于运算符的equals-variants首先检查相等性,并且字符串相等,则检查成功。它不能用于非等式检查变体,因为字符串是平等的。

==不使用相同的强制算法,它使用Abstract Equality Comparison Algorithm。该算法首先检查的是类型是否相同 - 当然,它们是两个裸露对象。因此,算法继续执行第一步,并进行检查f:

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

{}的每个用法都会创建一个新对象,所以此检查失败并且结果为false。

===是类似的,除了没有强制步骤。它在step 7失败,它使用与AECA的子步骤f相同的语言。

tl; dr:>=/<=以与==/===不同的方式胁迫。

相关问题