2013-02-04 11 views
7

Quali regole si applicano agli operatori di confronto relazionale JavaScript quando gli operandi sono di tipi diversi?In che modo gli operatori di confronto relazionale JavaScript costringono i tipi?

Ad esempio, come viene valutato true > null? Posso digitare questo nella mia console per sviluppatori e dà il risultato true, ma perché?

Ho cercato un po ', ma non ho trovato post di blog che spiegassero questo, anche se ci sono molte spiegazioni di tipo coercizione per operatori di confronto == e ===.

+1

Cari downvoters, si ricorda che StackOverflow [esplicitamente incoraggia chiedere e rispondere alle vostre proprie domande] (http://blog.stackoverflow.com/2011/ 07/its-ok-to-ask-and-answer-your-own-questions /), quindi gradirei un feedback che spieghi perché la mia domanda sta ricevendo voti negativi mentre la mia risposta sta ricevendo voti positivi :-) – Caspar

+3

La tua risposta è abbastanza buona . La tua domanda ... non tanto. Ricorda, le domande auto-risposte sono effettivamente incoraggiate, ma ottenere la parte giusta è * difficile *.Se la tua domanda non è di qualità eccezionale e non è contrassegnata come wiki della comunità, potrebbe essere downvoted o addirittura chiusa. Vedi http://meta.stackexchange.com/questions/163623/what-can-i-do-to-improve-the-question-portion-of-a-self-answered-android-debuggi per esempi di ciò che puoi fare per frenare questo. –

+0

Non ho intenzione di votare, ANCORA, voglio vedere la tua risposta a questo: come fai questa domanda e meno di 1 minuto dopo fornisci una risposta dettagliata e completa? Hai davvero avuto il dubbio? – Toping

risposta

19

JavaScript confronto relazionale tipo operatore coercizione è definita nella JavaScript specification, in particolare nelle sezioni 11.8 to 11.8.5 che descrivono gli operatori e sezioni 9.1 (ToPrimitive) e 9.3 (ToNumber) che descrivono il processo di costringere operandi.

In breve, i 4 operatori di confronto (<, >, <=, e >=) fanno del loro meglio per convertire ogni operando ad un numero, quindi confrontare i numeri. L'eccezione è quando entrambi gli operandi sono stringhe, nel qual caso vengono confrontati alfabeticamente.

In particolare,

  1. Se un argomento o è un oggetto al posto di un primitivo, try to convert it to a primitive value chiamando o.valueOf() o - se o.valueOf non è stato definito o non ha prodotto un tipo primitivo quando viene chiamato - chiamando o.toString()

  2. Se entrambi gli argomenti sono stringhe, confrontarli in base al loro lexicographical ordering. Ad esempio, questo significa "a" < "b" e "a" < "aa" entrambi restituiscono true.

  3. Altrimenti, convert each primitive to a number, il che significa:

    • undefined ->NaN
    • Null -> +0
    • Boolean tipo primitivo ->1 se true, +0 se false
    • String - >try to parse a number dalla stringa
  4. quindi confrontare ogni elemento come ci si aspetterebbe per l'operatore, con l'avvertenza che ogni confronto che coinvolge NaN restituisce false.

Quindi, questo significa quanto segue:

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 
Problemi correlati