这可能只是JavaScript的一个奇怪的怪癖,但我很好奇是否有人知道为什么会这样:
({} <= {}) => true
({} >= {}) => true
({} == {}) => false
({} === {}) => false
({} > {}) => false
({} < {}) => false
为什么前两个是真的,因为所有其他都是假的?
我认为在比较之前可能会将对象转换为数字,但是......
Number({}) >= Number({}) => false
答案 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:>=
/ <=
以与==
/ ===
不同的方式强制执行。