为什么对象大于/小于或等于不同的对象

Why is an object greater/less than or equal to a different object?

本文关键字:对象 于不同 小于 大于 为什么      更新时间:2023-09-26
这可能

只是JavaScript的一个奇怪怪癖,但我很好奇是否有人知道为什么会这样:

({} <= {}) => true

({} >= {}) => true

({} == {}) => false

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

({} > {}) => false

({} < {}) => false

既然其他两个都是假的,为什么前两个都是真的?

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

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

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

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

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

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

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

博士:>=/<=胁迫的方式与==/===不同。