Почему typeof null "object"?

Я читаю "Профессиональный Javascript для веб-разработчиков", глава 4, и он говорит мне, что пять типов примитивов: undefined, null, boolean, number и string.

Если null является примитивным, почему typeof(null) возвращает "object"?

Не означает ли это, что null передается по ссылке (я предполагаю, что все объекты передаются по ссылке), поэтому делает его НЕ примитивным?

Ответ 1

Со страницы MDN о поведении оператора typeof:

null

// This stands since the beginning of JavaScript
typeof null === 'object';

В первой реализации JavaScript значения JavaScript были представлены в виде тега типа и значения. Тег типа для объектов был 0. null был представлен как указатель NULL (0x00 на большинстве платформ). Следовательно, null имел 0 в качестве тега типа, поэтому возвращаемое значение "объекта" typeof. (ссылка)

Исправление было предложено для ECMAScript (через подписку), но было отклонено. Это привело бы к typeof null === 'null'.

Ответ 2

Если null является примитивным, почему typeof(null) возвращает "object"?

Потому что спецификация говорит так.

11.4.3 Оператор typeof

Производственное UnaryExpression: typeof UnaryExpression оценивается следующим образом:

  • Пусть val является результатом вычисления UnaryExpression.
  • Если Тип (val) Ссылка, затем
        а. Если IsUnresolvableReference (val) true, верните " undefined".
        б. Пусть val < GetValue (val).
  • Возвращает строку, определенную Тип (val) в соответствии с таблицей 20.

enter image description here

Ответ 3

Как уже отмечалось, спецификация говорит так. Но так как реализация JavaScript предшествует написанию спецификации ECMAScript, и спецификация была осторожна, чтобы не исправить недостатки первоначальной реализации, все еще существует законный вопрос о том, почему это было сделано в первую очередь. Douglas Crockford называет это ошибкой. Kiro Risk считает, что это сорта имеет смысл:

Поводом для этого является то, что null, в отличие от undefined, был (и остается) часто использоваться там, где появляются объекты. Другими словами, null часто используется для обозначения пустой ссылки на объект. Когда Брендан Эих создал JavaScript, он следовал той же парадигме, и имело смысл (возможно) вернуть "объект". Фактически, спецификация ECMAScript определяет null как примитивное значение, которое представляет намеренное отсутствие какого-либо значения объекта (ECMA-262, 11.4.11).

Ответ 4

Из книги YDKJS

Это давняя ошибка в JS, но она, вероятно, никогда не будет Быть исправленным. Слишком много кода в Интернете зависит от ошибки и, следовательно, его исправление вызовет гораздо больше ошибок!