2011-11-14 13 views
6

Mientras estaba jugando con las tablas de verdad en JavaScript, he notado que la siguiente se evalúa como verdadera:¿Por qué es {} <función() {}?

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

¿Por qué?

Solo he probado esto en Firefox, y estoy seguro de que podría desenterrar los detalles en la especificación ECMAScript 2.6.2, pero TBH me siento flojo.

+1

Es cierto en Chrome también. – jer

+0

Parece que podría estar simplemente comparando direcciones de los objetos. Si puede razonar con confianza acerca de la naturaleza de las entidades 'a' y' b', entonces probablemente no encontrará este miedo ... aunque ciertamente no puedo :-) –

+1

cuidado de los downvoter para comentar? – zzzzBov

Respuesta

17

tipo JavaScript coacción hace que la comparación esencialmente

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

tan esencialmente que se acaba de hacer

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

que es una comparación de cadenas lexicográfico.

+5

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

+4

O [este 11.8.5] (http: //es5.github.com/#x11.8.5) si no desea recorrer un PDF. –

8

Javascript compares objects llamando al valueOf() o toString().
Dado que ninguno de los operandos tiene un método valueOf(), comparará el toString() s.

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

[ es menos que f.

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

[ viene antes f, por lo tanto, ({}) < (function() {}).

Sí, es una tontería. ;)

0

bastante simple y fácil (internamente ambos están convertidos en cadenas) esto se debe en Javascript

Si un objeto se compara con un número o una cadena, JavaScript intenta devolver el valor predeterminado para el objeto. Los operadores intentan convertir el objeto en un valor primitivo, un valor de cadena o número, utilizando los métodos valueOf y toString de los objetos.

así que cuando ambos se comparan ambos objetos se convierten en cadena utilizando el método toString interna

a.toString() 
"[object Object]" 

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

por lo tanto, b será mayor que un (cadena más grande) Es por eso que b> a es verdadera

Cuestiones relacionadas