2011-07-13 17 views
20

¿Por qué (1 < NaN) devuelve false y no undefined (en JavaScript)?¿Por qué es (1 <NaN) falso en JavaScript?

En "11.8.5 El algoritmo abstracto de comparación relacional" dice que si cualquiera de los valores es NaN (después de ToPrimitive y ToNumber que no debería afectar a NaN en mi opinión) el resultado es undefined.

En FF y Chrome me sale:

console.log(1 < NaN); 
// false 

¿Por qué?

+4

1 por citar la especificación de una pregunta. :-) – RobG

+3

Definitivamente deberías investigar los problemas falsos/NaN/0/undefined/""/null de Javascript. Es terriblemente inconsistente y uno de los defectos más serios de este lenguaje (por lo demás bastante agradable). –

+0

@SF: Y si hubiera sido realmente estricto, la gente se quejaría de * que * en su lugar. :-) Las reglas no son del todo malas, y de hecho este ejemplo particular no tiene nada que ver con el falso/NaN/0/undefined/""/null. Es más que la especificación tiene esta sección que dice cómo funcionan las relaciones, pero luego tiene que buscar en otro lado para ver que después de haber hecho el trabajo en la sección citada, hay más de lo que hace el operador real. –

Respuesta

15

Debido a que el operador < vuelve false cuando el algoritmo de relación abstracta vuelve undefined. Ver Section 11.8.1:

11.8.1 El operador menor que (<)

El RelationalExpression producción: RelationalExpression < ShiftExpression se evalúa de la siguiente manera:

  1. Deje Lref ser el resultado de la evaluación de RelationalExpression.
  2. Deje que lval sea GetValue (lref).
  3. Deje rref Sea el resultado de la evaluación de ShiftExpression.
  4. Deje que rval sea GetValue (rref).
  5. Deje r Sea el resultado de realizar la comparación relacional abstracta lval < rval. (Ver 11.8.5)
  6. Si r es indefinido, volver falsa. De lo contrario, devuelva r.

Esto es cierto para todos los operadores relacionales. El algoritmo tiene un resultado undefined, pero los operadores lo convierten en false. Y eso tiene sentido. 1no es< NaN (ni es > NaN, o == NaN, o ... :-)).

(agradable ver a la gente que lee la especificación.)

+0

Sección 11.8.5: http://es5.github.com/#x11.8.5 –

+0

¡Ah! ¡Muchas gracias! – Sacha

Cuestiones relacionadas