Всем привет!
Сегодня давайте вместе раскроем тайну одного из самых противоречивых аспектов JavaScript: почему typeof null возвращает 'object'. Это путешествие во времена зарождения JavaScript обещает быть увлекательным.
🕵️♂️ Разгадываем головоломку. Начало 90-х. JavaScript еще молод и полон потенциала, но в его коде уже заложена эта загадка. Противоречивый вывод typeof null как 'object', хотя, на самом деле, null — это примитив. Звучит как ошибка? Давайте разберемся.
🏛 Код из древности. В самой первой версии JavaScript все данные были упакованы в 32-битные блоки. Эти блоки разделялись на две части: небольшую, где хранился «тег» (маркер), который сообщал о типе данных (1-3 бита). И другую, где хранились сами данные.
Представьте это как ящик, на котором есть этикетка (тег), говорящая, что внутри. А затем само содержимое (данные).
Было пять этикеток:
1. 000: объект. Внутри — ссылка на объект.
2. 1: целое число. Внутри — целое число с 31-битной знаковостью.
3. 010: число с плавающей запятой (double). Внутри — ссылка на такое число.
4. 100: строка. Внутри — ссылка на строку.
5. 110: логическое значение (true или false). Внутри — само логическое значение.
Но два значения были особенными:
— undefined имело числовое значение 230, это число находится вне диапазона обычных целых чисел;
— null было представлено как указатель NULL в машинном коде. Это значит, что у него была метка «объект» и ссылка, равная нулю.
Таким образом, когда мы использовали typeof с null, он видел его как «объект» из-за его метки.
🎭 Время проб и ошибок. Разработчики знали об этой странности, но исправление могло «сломать» старый код, который уже работал в интернете. Итак, они решили оставить все как есть, чтобы не вызвать проблемы.
✨ Совет для начинающих. Чтобы не запутаться при работе с null, всегда используйте «строгое сравнение» (===) с null:
value === null; // возвращает true или false в зависимости от значения.
Теперь вы знаете одну из многих тайн JavaScript и как с ней работать. Оставайтесь на связи для новых интересных историй!
Post #261
918

- 🔥 71
- ❤ 8
- 🏆 3
- 👍 1
- 😱 1