Странное поведение JavaScript: когда null одновременно и больше, и меньше нуля

Недавно мы рассмотрели случай, когда СУБД MySQL начинает вести себя странно, портит данные и не генерирует при этом сообщение об ошибке. В этот раз о забавной странности языка JavaScript.

Сюрпризы JavaScript

Следует сразу сказать, что это не глюк — этот фокус работает и в Google Chrome, и в Mozilla Firefox. Более того, такое поведение соответствует спецификации языка. И всё же… Откройте консоль вашего браузера и напечатайте:


null > 0;
null == 0;
null >= 0;

Попробуйте сначала отгадать результаты сравнений самостоятельно, а потом посмотрите на правильные ответы ниже:

JavaScript: null and zero

Казалось бы, полное отсутствие логики. null не больше нуля и не равен ему, но null больше или равен нулю. У разработчиков языка поехала крыша?

Нет. Вот тут спец по JS накатал 5-страничное исследование и объяснение. Если говорить кратко, операторы сравнения используют разные алгоритмы: Abstract Relational Comparison Algorithm и Abstract Equality Comparison Algorithm, которые дают разные результаты. В рамках своих задач они дают правильные и логичные результаты, но когда разные операторы используются в одном контексте, то и случаются такие сюрпризы.