Когда мы используем оператор «меньше или равно», это работа под капотом с абстрактным алгоритмом реляционного сравнения. Например.
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. Мне вот интересно, в чем причина?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Хотя <= использует абстрактный алгоритм реляционного сравнения, 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
- Let r be the result of performing abstract relational comparison rval < lval with LeftFirst equal to false.
- If r is true or undefined, return false. Otherwise, return true.
Алгоритм абстрактного реляционного сравнения может оценивать только true, false или undefined; поэтому «Иначе» на шаге 6 может применяться только тогда, когда r равно false, что делает a <= b эквивалентным b < a !== false ? false : true (опять же, где < представляет алгоритм абстрактного реляционного сравнения).
Большое спасибо :) Я изучаю JavaScript под капотом с вами :d
Присмотритесь к шаг 6 оператора «меньше или равно» (
<=): "Еслиrравноtrueилиundefined, вернутьfalse. В противном случае вернитеtrue."