Почему typeof null === 'object'?
Все JavaScript-программисты давно привыкли к тому, что typeof null === 'object'; // true
, хотя фактически null
— примитивное значение. Многие знают, что это баг, и лично Брэндан Айк это признает. Этот баг, вероятно, никогда не будет исправлен из-за необходимости сохранения обратной совместимости существующего кода с новыми версиями языка.
Интересна история того, как же это получилось. Она восходит корнями к первой версии языка, а именно — к тому факту, что значения переменных хранились в 32-битных ячейках в следующем формате: 29-31 бит: само значение; 1-3 бита: метка типа данных;
Было всего пять вариантов метки типа:
МЕТКА | ТИП |
---|---|
000 | object |
1 | integer |
010 | double |
100 | string |
110 | boolean |
Соответственно, если младший бит был равен единице, то оставшийся 31 бит интерпретировался как integer. Если 0 — то тип определялся в зависимости от значения следующих двух бит.
Также было два специальных зарезервированных значения:
undefined
(JSVAL_VOID
) — целое –230null
(JSVAL_NULL
) — указатель на NULL (machine code NULL pointer), то есть, метка объекта и ссылка на то, что его численное представление равно нулю.
Так и вышло, что typeof
стал определять null
как object
— он проверял метку типа, которая сообщала ему, что null
— это не что иное, как object
.
Впервые опубликовано на Хабре 10 февраля 2014