Подтвердить что ты не робот

Почему (1 <NaN) false в JavaScript?

Почему (1 < NaN) возвращает false, а не undefined (в JavaScript)?

В "11.8.5. Алгоритм абстрактного реляционного сравнения" говорится, что если любое из значений NaN (после ToPrimitive и ToNumber, которое не должно влиять на NaN в моем представлении), результат равен undefined.

В FF и Chrome я получаю:

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

Почему это?

4b9b3361

Ответ 1

Поскольку оператор < возвращает false, когда абстрактный реляционный алгоритм возвращает undefined. См. Раздел 11.8.1:

11.8.1 Менее чем оператор (<)

Производство RelationalExpression: RelationalExpression < Выражение Shift оценивается следующим образом:

  • Пусть lref является результатом вычисления RelationalExpression.
  • Пусть lval - GetValue (lref).
  • Пусть rref является результатом оценки выражения Shift.
  • Пусть rval - GetValue (rref).
  • Пусть r является результатом выполнения абстрактного реляционного сравнения lval < RVAL. (см. 11.8.5)
  • Если r undefined, верните false. В противном случае верните r.

Это относится ко всем реляционным операторам. Алгоритм имеет результат undefined, но операторы преобразуют его в false. И это имеет смысл. 1 не < NaN (и это не > NaN, или == NaN, или...:-)).

(Приятно видеть, что люди читают спецификацию.)