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

Javascript 为什么一个对象大于/小于或等于另一个对象?,javascript,Javascript,这可能只是JavaScript的一个奇怪的怪癖,但我很好奇是否有人知道为什么会发生这种情况: ({}true ({}>={})=>true ({}=={})=>false ({}==={})=>false ({}>{})=>false ({}false 既然其他的都是假的,为什么前两个是真的 我认为这可能是在比较之前将对象转换为数字,但是 Number({})>=Number({})=>false在ES5中使用=操作符使用,这是一种奇特的说法,表示它在比较类型之前强制类型。当使用[[ToPrim

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

({}true

({}>={})=>true

({}=={})=>false

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

({}>{})=>false

({}<{})=>false

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

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

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

在ES5中使用
=
操作符使用,这是一种奇特的说法,表示它在比较类型之前强制类型。当使用
[[ToPrimitive]]
强制
{}
时,它会返回
toString()
方法,该方法返回
“[object object object]
对于这两种类型。由于小于/大于运算符的equals变量首先检查相等,并且字符串相等,因此检查成功。非相等检查变量失败,因为字符串相等

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

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

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

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


tl;dr:
=
/
类型转换规则在
=
=
之间不同。您可以阅读关于大于和小于以及关于
=
的内容。