Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Почему у null в JS тип «object»?

На «Хабре» вышла статья, проливающая свет на загадку — почему же у null в Джаваскрипте тип «объект». Причём, если попытаться этому «объекту» добавить какое-то свойство, то браузер воспротивится: скажет, что null объектом не является.

Null как объект (13.48КиБ)

Вообще, я этому особого значения не придавал. Ну да, примитивное значение, имеет тип объект, хотя по факту им не является, смысла я в этом не вижу, это мешает, но поменять это нельзя.

Оказывается, это баг. Точнее даже не баг, а просто «так получилось». В ранних интерпретаторах Джаваскрипта тип хранился в первых трёх битах значения. Для типа «а это у нас null» значения не хватило, ему дали тип «объект», а под значение выделили нулевой указатель. Ну typeof, особо не заморачиваясь, выдавала object.

К сожалению, программисты поленились сделать дополнительную проверку. Можно было при наличии нулевого указателя попросить typeof выводить «null» и дело в шляпе. Сейчас, как оказалось, куча кода завязано на это поведение и ломать уже ничего никто не будет.

9 комментариев
shaltai-boltai 2014

Если уж хочется что-то поменять, то логичнее будет расширить поведение до полноценного Object? Хоть какая-то польза может выйти.

История в тему: недавно на собеседовании вьюноши учудили и начали спрашивать меня про типы данных. Тогда про null для них и случилось открытие ) Детишки про фишку тупо не знали. Ясно, что на работу уже не позвали. А снаружи это вполне солидный ресурс.

Евгений Степанищев (bolknote.ru) 2014

Комментарий для shaltai-boltai:

Честно сказать, если его расширить, то мне польза неочевидна как-то :) Давать ему методы через прототип? :) Разве что только для целостности языка какая-то польза будет.

А вот проблемы некоторые это рождает. Например, известнейшая проверка «а объект ли это» снабжается костылём «и не null».

shaltai-boltai 2014

Ну да, больше для целостности. Null-объект можно делать типизированным, можно какую-то историю для undo хранить. Всё лучше, чем ничего.

blgo.ru/ 2014

Ну вообще-то, NULL теоретически подпадает под возможное значение объекта.
Во многих языках с проверкой типа любой объект может быть NULL.
Я думал из этих побуждений и здесь так сделано, а не баг.
Но, конечно на практике в JS это не удобно.

Евгений Степанищев (bolknote.ru) 2014

Комментарий для http://blgo.ru/:

Это баг, автор языка написал почему так.

Максим Зотов 2014

куча кода завязано на это поведение и ломать уже ничего никто не будет.

Как можно завязывать код на ошибку? Или просто на нелогичные особенности реализации языка. Так что даже если бы сломали, такому коду всё равно прямая дорога на помойку.

Евгений Степанищев (bolknote.ru) 2014

Комментарий для Максим Зотов:

Основная цель браузеров — развиваться, оставаясь в рамках обратной совместимости. Старые сайты никто модифицировать не будет.

Максим Зотов 2014

Комментарий для Евгения Степанищева:

Да это понятно, реплика была не про полезность обратной совместимости, а про вредность написания плохого кода. И она в первую очередь не в том, что у кода плохая совместимость, а в том, что такой код нечитаем, непонятен и неподдерживаем.

Евгений Степанищев (bolknote.ru) 2014

Комментарий для Максим Зотов:

Это просто данность языка, приходится её учитывать. Соответственно, весь код, где эта данность учитывается и поломается.