Является ли JavaScript Null на самом деле объектом?

Является ли JavaScript Null на самом деле объектом?

Содержание
  1. Краткая история JavaScript
  2. Как значения хранятся в памяти
  3. Почему бы не изменить это?

Как начинающий изучать JavaScript, вы могли столкнуться со странным поведением, которое поначалу кажется непонятным. Одно из них - когда вы проверяете тип null с помощью оператора typeof, он возвращает “object”, а не что-то вроде “null”.

typeof null; // "object"

Вход в полноэкранный режим

Поначалу это кажется бессмысленным. Null должен представлять отсутствие значения, так почему же он считается объектом?

Чтобы понять, почему так происходит, нам нужно узнать немного истории языка JavaScript.

Краткая история JavaScript

JavaScript был создан в 1995 году Бренданом Эйхом всего за 10 дней! Изначально язык назывался Mocha, затем LiveScript и, наконец, JavaScript, когда он был выпущен вместе с Java в Netscape Navigator 2.0.

При создании JavaScript Эйх заимствовал идеи из других языков, таких как Self и Scheme. Ему также нужно было убедиться, что он хорошо интегрируется с Java в браузере.

Такие сжатые сроки означали, что JavaScript нужно было разработать и реализовать очень быстро, не слишком планируя наперед. В результате в язык вкрались некоторые недостатки, которые влияют на нас и по сей день. Одним из таких примеров является поведение typeof null!

Как значения хранятся в памяти

В первой версии JavaScript было всего пять примитивных типов данных:

  • Неопределенный
  • булево
  • число
  • Строка
  • Объект

Это было все! Других примитивных типов, таких как null, symbol или bigint, не существовало.

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

Чтобы понять, почему null возвращает ”объект”, нам нужно узнать, как в JavaScript значения представляются в памяти.

В первоначальной реализации JS значения хранились в памяти в виде тега типа и фактических данных.

Тег типа использовался для определения типа данных. Объектам присваивался тег типа 0.

Значение в памяти:

Тег типа: 0
Данные: {...}

Вход в полноэкранный режим

Для примитивных значений, таких как строки, числа и т. д., тег type будет другим:

Тег типа: 1
Данные: "Hello World"

Вход в полноэкранный режим

Когда речь зашла о null, который представляет собой отсутствие значения, было решено хранить его в памяти в виде нулевого указателя, который в большинстве языков обозначается как 0x00.

Таким образом, в итоге null будет храниться в памяти как:

Type Tag: 0
Данные: 0x00

Вход в полноэкранный режим

Заметили тег типа 0? Тот же самый, что используется для объектов!

Именно поэтому при проверке типа null он выдаст сообщение “object” - из-за того, что у него такой же тег типа.

Почему бы не изменить это?

Итак, ясно, что это было небольшое упущение в первоначальной реализации. Почему бы просто не изменить его так, чтобы у null был свой тег типа, а typeof возвращал “null”?

Основная причина - обратная совместимость. Когда typeof null был заменен на “object”, многие существующие коды уже полагались на такое поведение. Его изменение привело бы к поломке этого кода.

Вот несколько примеров:

// Опора на то, что null является объектом
function check(val) {
  if (typeof val === 'object') {
    // сделайте что-нибудь
  }
}

check(null); // сломается при изменении

Вход в полноэкранный режим

Поскольку JavaScript используется так широко, обратная совместимость очень важна. Странное поведение typeof оставили, чтобы избежать потенциальной поломки веба!

Надеюсь, это дало вам лучшее понимание того, почему JavaScript демонстрирует такое странное поведение с null! История языков программирования полна подобных причуд, но они помогают показать, как языки являются развивающимися инструментами.

Общайтесь со мной в twitter: MohitSChauhan

Счастливого кодинга ❤️