Банан велик, а кожура еще больше
Много когда-то программировал на ДжаваСкрипте, поэтому многие его «особенности» просто заучил наизусть, даже не утруждая себя детальным пониманием почему и как это работает. В свою защиту хочу сказать, что многие вещи там просто «исторически сложились»
А тут братишка прислал в «Телеграм» кусок кода, который всплывает на «Стек Оверфлоу» не первый год:
console.log(0 >= null); // выведет true
console.log(0 > null || 0 == null); // выведет false
Странное поведение, как ни крути, ведь даже название операции «больше или равно» раскладывается на две — либо «больше», либо «равно». Казалось бы оба варианта должны давать одинаковый результат.
Решил я полюбопытствовать есть ли объяснение этому феномену.
Во всех браузерах работает одинаково странно, а это значит, что где-то в стандарте должно быть детально описано это поведение. И действительно, вот это место:
Let r be the result of performing abstract relational comparison lval < rval
If r is true or undefined, return false. Otherwise, return true
Что означает примерно следующее: если нам надо выполнить операцию
Но ведь странное поведение у второй строки, а не у первой?
Что вы имеете ввиду?
Вообще-то нет, это не то. То, что 0 > null, наверное, никого не удивляет. Объяснение кроется в том, что при нестрогом сравнении null равен только null и undefined. А при любых сравнениях больше-меньше приводится к числу 0.
Мне казалось, что 0 > null и поэтому первая строка очевидна, а вот вторая как-раз странная.
Сейчас проверил — опа, указывается, 0 не больше, не меньше и не равен null. В этом случае действительно, вторая строка ведет себя как надо, а странная — первая.
Но тогда у меня другой вопрос — почему 0 не больше, не меньше и не равен null...
Потому же почему «ноль» не больше, не меньше и не равен undefined. Только undefined — «значение не определено», а null — «значение отсутствует».
Да они там упоролись с null и undefined, эти экмаскриптовцы!
Ну ладно, пусть результат сравнения с null будет не null (как в SQL) а false, но «оптимизировать» «<=», полагаясь на определённость всего, — это уже совсем плохо.
Не думаю, что оптимизация. Скорее всего они сначала сделали, а потом подогнали стандарт под сделанное. Но это не точно.
Ну да, «сделали баг фичей». (И у них оба нестрогих неравенства дают true, что тоже весело.)