2013-02-04 68 views
7

當操作數是不同類型時,JavaScript關係比較操作符適用什麼規則?JavaScript關係比較運算符如何強制類型?

例如,true > null如何評估?我可以在我的開發者控制檯中輸入這個結果,並給出結果true,但是爲什麼?

我搜索了一下,但沒有找到任何博客文章解釋這一點,雖然有很多解釋類型的強制==和===比較運算符。

+1

親愛downvoters,請注意,StackOverflow的[明確鼓勵提出和回答自己的問題(http://blog.stackoverflow.com/2011/ 07 /它可以問問題和答案你自己的問題/),所以我將不勝感激一些反饋,解釋爲什麼我的問題是收到downvotes而我的答案是upvotes :-) – Caspar

+3

你的答案是相當不錯的。你的問題...不是很多。請記住,確實鼓勵自我回答的問題,但正確的問題是*難*。如果你的問題質量不高,並且沒有標註社區維基,那麼它很可能會被低估或甚至關閉。請參閱http://meta.stackexchange.com/questions/163623/what-c​​an-i-do-to-improve-the-question-portion-of-a-self-answered-android-debuggi瞭解您可以做些什麼的示例做遏制這一點。 –

+0

即時通訊不會downvote,我希望看到你的答案:你如何提出這樣的問題,不到1分鐘後,你給一個詳細和完整的答案?你真的懷疑? – Toping

回答

19

JavaScript的關係比較運算類型強制在限定JavaScript specification,特別是在其中描述了運營商,其描述強迫操作數的過程的部分11.8 to 11.8.5,和部分9.1 (ToPrimitive)9.3 (ToNumber)

總之,4個比較運算符(<><=>=)盡最大努力去每個操作數轉換爲數字,然後進行比較的數字。兩個操作數都是字符串時例外,在這種情況下,它們按字母順序進行比較。

具體地說,

  1. 如果參數o是一個對象,而不是原始的,try to convert it to a primitive value通過調用o.valueOf()或 - 如果o.valueOf沒有定義或沒有回叫時基本類型 - 通過調用o.toString()

  2. 如果兩個參數都是字符串,請根據它們的lexicographical ordering進行比較。例如,這意味着"a" < "b""a" < "aa"都返回true。

  3. 否則,convert each primitive to a number,這意味着:

    • undefined - >NaN
    • Null - > 0
    • Boolean基本類型 - >1如果true+0如果false
    • String - >try to parse a number來自字符串
  4. 然後按照您對操作員的期望比較每個項目,並注意任何涉及NaN的比較評估爲false

所以,這意味着:

console.log(true > null);   //prints true 
console.log(true > false);   //prints true 
console.log("1000.0" > 999);  //prints true 
console.log(" 1000\t\n" < 1001); //prints true 

var oVal1 = { valueOf: function() { return 1; } }; 
var oVal0 = { toString: function() { return "0"; } }; 

console.log(oVal1 > null);   //prints true 
console.log(oVal0 < true);   //prints true 
console.log(oVal0 < oVal1);  //prints true