Ну, вы догадались, что слева = не так == неправильно (извините за это, но я давно хотел это сделать xD)
Ответ — «объект», да, typeof null
возвращает object
как тип в JavaScript. Я только вчера узнал об этом. Так что пришлось искать, потому что это не имело никакого смысла ;)
Вы можете подумать, что null
— это примитивное значение, как его тип вернет object
?? Читать вдоль…
Краткий ответ для быстрых читателей
Это не то, что он должен возвращать, да, вы все правильно прочитали!
Это давно известная проблема в JavaScript (или, можно сказать, в ECMAScript). Об этом есть комментарий в книге YDKJS:
Это давняя ошибка в JS, но, скорее всего, она никогда не будет исправлена. Слишком много кода в Интернете зависит от ошибки, поэтому ее исправление вызовет гораздо больше ошибок!
Это связано с тем, как JavaScript фактически определяет тип данных переменной (объяснение в длинной части ниже).
Утверждение в блоге, которое я нашел значимым:
Причина этого в том, что
null
, в отличие отundefined
, часто использовалось (и до сих пор) там, где появляются объекты. Другими словами,null
часто используется для обозначения пустой ссылки на объект. Когда Брендан Эйх создал JavaScript, он следовал той же парадигме, и имело смысл (возможно) возвращать «объект». На самом деле спецификация ECMAScript определяетnull
как примитивное значение, представляющее преднамеренное отсутствие какого-либо значения объекта (ECMA-262, 11.4.11).
Было предложено исправление (попробуйте ознакомиться с предложением, очень интересно) для ECMAScript (через подписку), но оно, очевидно, было отклонено. Это привело бы к typeof null === null
Длинный ответ для любознательных парней
На самом деле существует логическое объяснение, объясняющее, почему null
— это object
in JavaScript.
В первоначальной версии JavaScript значения хранились в 32-битных единицах, которые состояли из небольшого тега типа (1–3 бита), а остальные содержали фактические данные значение. Теги типа хранились в младших битах единиц измерения. Их было пятеро:
000: object. The data is a reference to an object. 1: int. The data is a 31 bit signed integer. 010: double. The data is a reference to a double floating point number. 100: string. The data is a reference to a string. 110: boolean. The data is a boolean.
Таким образом, если младший бит равен «1», то длина тега type составляет всего один бит.
Если это '0', то тег типа имеет длину 3 бита, предоставляя два дополнительных бита для четырех типов.
Для object
именно 000
определяло его тип, а null
было представлением null pointer
. Однако в JavaScript, подобно C, не было указателей. Так что null
ничего не означало, просто пустота, и в итоге представляло все 0. Все его 32 бита были 0. Поэтому всякий раз, когда интерпретатор JavaScript читает null, он считает первые 3 бита 000
, что совпадает с object
.
Вот почему typeof
null возвращает "объект"
Источники: Блог Акселя Раушмайера || Переполнение стека
Я изо всех сил старался объяснить (*кашляет* копипаст из исходников *кашляет*), почему это происходит. Надеюсь, этот пост помог вам так или иначе!
Пока вы снова не прочитаете мой блог…!! 👋
Все, что вам нужно знать об «Fetch API
Вводное руководство по Fetch API в JavaScriptjavascript.plainenglish.io»