Оператор «меньше или равно»: с NaN

Когда мы используем оператор «меньше или равно», это работа под капотом с абстрактным алгоритмом реляционного сравнения. Например.

a <= b;

Преобразуйте в JavaScript, как это

!(b < a)

И спецификация EcmaScript говорит (http://www.ecma-international.org/ecma-262/5.1/#sec-11.8.5), который указывает, что по крайней мере один операнд имеет значение NaN меньше, чем return undefined И это означает

var a = 1;
var b = "asd"
a < b // b.toNumber() => NaN and this is operation return undefined (false)

Если мы используем вот так

var a = 1;
var b = "asd"
a <= b // this convert to  !(b < a) and (b<a) return undefined
// and !(undefined) must be true

Но спецификация EcmaScript говорит, что это возвращает false. Мне вот интересно, в чем причина?


person Murad Sofiyev    schedule 29.07.2019    source источник
comment
Внимательно изучите шаг 6 менее чем Оператор равенства или (<=): Если r равно true или undefined, вернуть false. В противном случае вернуть true.   -  person Bergi    schedule 30.07.2019


Ответы (1)


Хотя ‹= использует алгоритм абстрактного реляционного сравнения, a <= b не эквивалентен !(b < a). Он эквивалентен b < a !== false ? false : true (где < представляет абстрактный алгоритм реляционного сравнения, а не оператор JavaScript <, который никогда не может дать результат undefined), который ведет себя так же, как !(b < a), когда b < a является истинным или точно false, но не ведет себя так же, когда b < a вообще ложно. Если b < a оценивается как undefined, все выражение будет оцениваться как false.

Это определено в спецификации на шаге 6 здесь: https://www.ecma-international.org/ecma-262/5.1/#sec-11.8.3

  1. Пусть r будет результатом выполнения абстрактного реляционного сравнения rvallval с LeftFirst равным false< /сильный>.
  2. Если r равно true или не определено, вернуть false. В противном случае верните true.

Алгоритм абстрактного реляционного сравнения может оценивать только true, false или undefined; поэтому «Иначе» на шаге 6 может применяться только тогда, когда r равно false, что делает a <= b эквивалентным b < a !== false ? false : true (опять же, где < представляет алгоритм абстрактного реляционного сравнения).

person Paul    schedule 29.07.2019
comment
Большое спасибо :) Я изучаю JavaScript под капотом с вами: d - person Murad Sofiyev; 30.07.2019