为什么一个对象大于/小于或等于另一个对象?

Bry*_*ing 10 javascript

这可能只是 JavaScript 的一个奇怪的怪癖,但我很好奇是否有人知道为什么会发生这种情况:

({} <= {}) => true

({} >= {}) => true

({} == {}) => false

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

({} > {}) => false

({} < {}) => false

考虑到所有其他都是假的,为什么前两个是真的?

我认为它可能在比较之前将对象转换为数字,但是......

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

vge*_*gel 18

使用</ <=/ >/>=在ES5运营商使用抽象关系比较算法,这是说它比较之前强制转换的类型,一个奇特的方式。当{}被 强制时[[ToPrimitive]],它会回退到该toString()方法,该方法"[object Object]"为两者都返回。因为小于/大于运算符的等于变量首先检查相等性,并且字符串相等,所以检查成功。对于非相等检查变体,它失败了,因为字符串是相等的。

==不使用相同的强制算法,它使用抽象平等比较算法。该算法检查的第一件事是类型是否相同——当然,对于两个裸对象,它们是相同的。因此,算法继续执行第一步,然后向下检查 f:

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

每次使用{}都会创建一个新对象,因此此检查失败且结果为假。

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

tl;dr: >=/<=以不同于==/ 的方式强制===。