2011-11-14 16 views
6

Mentre ero nei guai con le tabelle di verità in JavaScript, ho notato che la seguente restituisce true:Perché {} <function() {}?

var a, b, c; 
a = {}; 
b = function(){}; 
c = a < b; 
console.log(c); 

Perché?

Ho solo provato questo in Firefox, e sono sicuro di poter recuperare i dettagli nella specifica ECMAScript 2.6.2, ma TBH mi sento pigro.

+1

È vero anche in Chrome. – jer

+0

Sembra che si possa semplicemente confrontare gli indirizzi degli oggetti. Se puoi ragionare con sicurezza sulla natura delle entità 'a' e' b', probabilmente non troverai questo pauroso ... anche se non posso certamente :-) –

+1

cura di downvoter commentare? – zzzzBov

risposta

17

JavaScript tipo coercizione rende il confronto essenzialmente

String({}) < String(function(){}) 

Quindi, in sostanza si sta solo facendo

"[object Object]" < "function(){}" 

che è un confronto di stringhe lessicografico.

+5

Vedere [ECMA-262] (http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf), sezione 11.8.5 – NullUserException

+4

Oppure [questo 11.8.5] (http: //es5.github.com/#x11.8.5) se non vuoi guadare un PDF. –

8

Javascript compares objects chiamando il numero valueOf() o toString().
Poiché nessuno degli operandi ha un metodo valueOf(), esso confronta i valori di toString() s.

({}).toString() è [object Object].
(function() { }).toString() è function() { }.

[ è inferiore a f.

4
alert(({}))   -> [object Object] 
alert((function(){})) -> function() {} 

[ viene prima f, quindi ({}) < (function() {}).

Sì, è sciocco. ;)

0

abbastanza semplice e facile (internamente sono entrambi convertiti in stringhe) questo è perché in Javascript

Se un oggetto viene confrontato con un numero o una stringa, JavaScript tenta di restituire il valore di default per il oggetto. Gli operatori tentano di convertire l'oggetto in un valore primitivo, un valore String o Number, utilizzando i metodi valueOf e toString degli oggetti.

così quando entrambi sono confrontati entrambi gli oggetti vengono convertiti in stringa usando il metodo Tostring interna

a.toString() 
"[object Object]" 

b.toString() 
"function() { }" 

quindi b sarà maggiore di un (stringa più grande) Ecco perché b> a è vera

Problemi correlati