Банан велик, а кожура еще больше

Много когда-то программировал на ДжаваСкрипте, поэтому многие его «особенности» просто заучил наизусть, даже не утруждая себя детальным пониманием почему и как это работает. В свою защиту хочу сказать, что многие вещи там просто «исторически сложились»

А тут братишка прислал в «Телеграм» кусок кода, который всплывает на «Стек Оверфлоу» не первый год:

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

Что означает примерно следующее: если нам надо выполнить операцию «lval >= rval», то мы должны её преобразовать в «!(lval < rval)». То есть «0 >= null» преобразовывается в «!(0 < null)», результат операции внутри скобок — false (так как «ноль» не меньше, чем null), что после отрицания даёт нам true. Всё просто.

Читайте также

Как скачать документ из АИС ЦГАСО-3
Архив ЦГАСО несколько изменил у себя вёрстку и предыдущий способ скачивания работать перестал. Сегодня мне понадобились документы из этого архива, пришлось посмотреть в чём дело.
2015
Как скачать документ из АИС ЦГАСО-2
Самарский архив видимо что-то у себя обновил и предыдущий способ для скачивания документов оттуда работать перестал. Очень жаль, удобство работы с интерфейсом архива оставляет желать лучшего, не говоря о скорости доступа к документам.
2014
PHP и UTF-8: первый этап
Я решил описать переход проекта на UTF-8, как это у меня получается. Иногда будут достаточно больше куски кода.
2010

Комментарии 8

GreLI № 3
Вообще-то нет, это не то. То, что 0 > null, наверное, никого не удивляет. Объяснение кроется в том, что при нестрогом сравнении null равен только null и undefined. А при любых сравнениях больше-меньше приводится к числу 0.
Михаил № 4
Мне казалось, что 0 > null и поэтому первая строка очевидна, а вот вторая как-раз странная.

Сейчас проверил — опа, указывается, 0 не больше, не меньше и не равен null. В этом случае действительно, вторая строка ведет себя как надо, а странная — первая.

Но тогда у меня другой вопрос — почему 0 не больше, не меньше и не равен null…
Евгений Степанищев автор № 5
Потому же почему «ноль» не больше, не меньше и не равен //undefined//. Только //undefined// — «значение не определено», а //null// — «значение отсутствует».
Baka № 6
Да они там упоролись с null и undefined, эти экмаскриптовцы!
Ну ладно, пусть результат сравнения с null будет не null (как в SQL) а false, но «оптимизировать» "
Евгений Степанищев автор № 7
Не думаю, что оптимизация. Скорее всего они сначала сделали, а потом подогнали стандарт под сделанное. Но это не точно.