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:
- Deje Lref ser el resultado de la evaluación de RelationalExpression.
- Deje que lval sea GetValue (lref).
- Deje rref Sea el resultado de la evaluación de ShiftExpression.
- Deje que rval sea GetValue (rref).
- Deje r Sea el resultado de realizar la comparación relacional abstracta lval < rval. (Ver 11.8.5)
- 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. 1
no es< NaN
(ni es > NaN
, o == NaN
, o ... :-)).
(agradable ver a la gente que lee la especificación.)
1 por citar la especificación de una pregunta. :-) – RobG
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). –
@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. –