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

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

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

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. Всё просто.

Поделиться
Отправить
8 комментариев
Михаил

Но ведь странное поведение у второй строки, а не у первой?

Евгений Степанищев

Что вы имеете ввиду?

GreLI

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

Михаил

Мне казалось, что 0 > null и поэтому первая строка очевидна, а вот вторая как-раз странная.

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

Но тогда у меня другой вопрос — почему 0 не больше, не меньше и не равен null...

Евгений Степанищев

Потому же почему «ноль» не больше, не меньше и не равен undefined. Только undefined — «значение не определено», а null — «значение отсутствует».

Baka

Да они там упоролись с null и undefined, эти экмаскриптовцы!
Ну ладно, пусть результат сравнения с null будет не null (как в SQL) а false, но «оптимизировать» «<=», полагаясь на определённость всего, — это уже совсем плохо.

Евгений Степанищев

Не думаю, что оптимизация. Скорее всего они сначала сделали, а потом подогнали стандарт под сделанное. Но это не точно.

Baka

Ну да, «сделали баг фичей». (И у них оба нестрогих неравенства дают true, что тоже весело.)

Популярное