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

时间:2016-04-28 22:20:27

标签: javascript

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

({} <= {}) => true

({} >= {}) => true

({} == {}) => false

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

({} > {}) => false

({} < {}) => false

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

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

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

1 个答案:

答案 0 :(得分:3)

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

==没有使用相同的强制算法,它使用Abstract Equality Comparison Algorithm。这个算法检查的第一件事是类型是否相同 - 当然,它们是两个裸对象。因此,算法继续第一步,然后向下检查f:

  

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

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

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

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