- PVSM.RU - https://www.pvsm.ru -

Почему typeof null === ‘object’?

Все JavaScript-программисты давно привыкли к тому, что typeof null === 'object'; // true, хотя фактически null — примитивное значение. Многие знают, что это баг, и лично Брэндан Айк это признает [1]. Этот баг, вероятно, никогда не будет исправлен из-за необходимости сохранения обратной совместимости существующего кода с новыми версиями языка.

Интересна история того, как же это получилось. Она восходит корнями к первой версии языка, а именно — к тому факту, что значения переменных хранились в 32-битных ячейках в следующем формате:
29-31 бит: само значение;
1-3 бита: метка типа данных;

Было всего пять вариантов метки типа:
000: object;
1: integer;
010: double;
100: string;
110: boolean;

Соответственно, если младший бит был равен единице, то оставшийся 31 бит интерпретировался как integer. Если 0 — то тип определялся в зависимости от значения следующих двух бит.

Также было два специальных зарезервированных значения:

undefined (JSVAL_VOID) — целое –230
null (JSVAL_NULL) — указатель на NULL (machine code NULL pointer), то есть, метка объекта и ссылка на то, что его численное представление равно нулю.

Так и вышло, что typeof стал определять null как object — он проверял метку типа, которая сообщала ему, что null — это не что иное, как object.

via [2]

Автор: oshibka404

Источник [3]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/javascript/54616

Ссылки в тексте:

[1] признает: http://wiki.ecmascript.org/doku.php?id=harmony:typeof_null

[2] via: http://www.2ality.com/2013/10/typeof-null.html

[3] Источник: http://habrahabr.ru/post/200664/