Почему 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.
Ответ 3
Как уже отмечалось, спецификация говорит так. Но так как реализация JavaScript предшествует написанию спецификации ECMAScript, и спецификация была осторожна, чтобы не исправить недостатки первоначальной реализации, все еще существует законный вопрос о том, почему это было сделано в первую очередь. Douglas Crockford называет это ошибкой. Kiro Risk считает, что это сорта имеет смысл:
Поводом для этого является то, что null
, в отличие от undefined
, был (и остается) часто использоваться там, где появляются объекты. Другими словами, null
часто используется для обозначения пустой ссылки на объект. Когда Брендан Эих создал JavaScript, он следовал той же парадигме, и имело смысл (возможно) вернуть "объект". Фактически, спецификация ECMAScript определяет null
как примитивное значение, которое представляет намеренное отсутствие какого-либо значения объекта (ECMA-262, 11.4.11).
Ответ 4
Из книги YDKJS
Это давняя ошибка в JS, но она, вероятно, никогда не будет Быть исправленным. Слишком много кода в Интернете зависит от ошибки и, следовательно, его исправление вызовет гораздо больше ошибок!
Ответ 5
If null
is a primitive, why does typeof(null)
return "object
"?
вкратце: это ошибка в ECMAScript, и тип должен быть null
ссылка: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null