2016-04-28 59 views
2

這可能只是JavaScript的一個奇怪的怪癖,但我很好奇,如果有人知道爲什麼發生這種情況:爲什麼對象大於/小於或等於不同的對象?

({} <= {}) => true

({} >= {}) => true

({} == {}) => false

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

({} > {}) => false

({} < {}) => false

爲什麼前兩個假設所有其他人都是假的?

我認爲它可以比較前鑄造的對象號碼,但...

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

+0

類型轉換的規則在'=='和'<='/'> ='之間是不同的。 – Pointy

+2

你可以閱讀[this](http://www.ecma-international.org/ecma-262/5.1/#sec-11.8.5)關於大於和小於,[this](http:/ /www.ecma-international.org/ecma-262/5.1/#sec-11.9.3)關於'=='。 – Pointy

回答

2

使用</<=/>/>=運營商在ES5採用了Abstract Relational Comparison Algorithm,這是一個奇特的說比較它們之前強制類型的方式。當{}被強制[[ToPrimitive]]時,它回落到toString()方法,這兩個方法返回"[object Object]"。因爲小於/大於運算符的equals-variants首先檢查相等性,並且字符串相等,則檢查成功。它不能用於非等式檢查變體,因爲字符串是平等的。

==不使用相同的強制算法,它使用Abstract Equality Comparison Algorithm。該算法首先檢查的是類型是否相同 - 當然,它們是兩個裸露對象。因此,算法繼續執行第一步,並進行檢查f:

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

{}的每個用法都會創建一個新對象,所以此檢查失敗並且結果爲false。

===是類似的,除了沒有強制步驟。它在step 7失敗,它使用與AECA的子步驟f相同的語言。

tl; dr:>=/<=以與==/===不同的方式脅迫。

相關問題