@Ostic
Программист - любитель

Почему у Null и Undefined нет прототипа и почему у других типов они именно такие?

Здравствуйте
Разбираюсь с прототипами и возникают вопросы:
1. Почему у типов Null и Undefined нет прототипа? Вроде как всё создается конструкторами. Как посмотреть что у них внутри?
Вот примитивные типы JS
5ff4a1975ac80132732956.jpeg
вот что показывает консоль для всех примитивных типов кроме Null и Udefined
5ff4a20fa7d22227573055.jpeg
те оно как бы и понятно, показывает функцию-конструктор, а вот при попытке написать Undefined или Null, говорит, что знать такого не знает...
Почему так?
  • Вопрос задан
  • 160 просмотров
Решения вопроса 1
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Потому что прототипы есть только у объектов, то есть у сущностей (entity) для которых верноtypeof entity === 'object'Правда тут есть одно исключение - в спеке нет типа function, а во всех реализациях он есть по историческим причинам. То есть с точки зрения спеки:typeof function(){} === 'object'а на деле:typeof function(){} === 'function'Поэтому правильное тождество будет такое:
typeof entity === 'object' || typeof entity === 'function'


У остальных типов прототипа нет, в чем можно легко убедится
1 instanceof Number
1 instanceof Object
'a' instanceof String
'a' instanceof Object
true instanceof Boolean
true instanceof Object
1n instanceof BigInt
1n instanceof Object
Symbol() instanceof Symbol
Symbol() instanceof Object
null instanceof Object
undefined instanceof Object
все эти выражения ложны, а как известно instanceof проверяет именно прототипы.

А для того чтоб работали методы для большинства этих типов есть объектные обертки, к которым присутствует неявное приведение при обращении к свойствам через точку или квадратные скобки. Эти обертки не сложно получить передав данные примитивы в Object как функцию, а не как конструктор:
Object(1) instanceof Number
Object(1) instanceof Object
Object('a') instanceof String
Object('a') instanceof Object
Object(true) instanceof Boolean
Object(true) instanceof Object
Object(1n) instanceof BigInt
Object(1n) instanceof Object
Object(Symbol()) instanceof Symbol
Object(Symbol()) instanceof Object
все эти выражения истинны.
Однако надо понимать, что обертка - это уже не примитив:
typeof Object(1) === 'object'
typeof Object('a') === 'object'
typeof Object(true) === 'object'
typeof Object(1n) === 'object'
typeof Object(Symbol()) === 'object'
это все так же истинно.

А вот у юнит-типов (типов-значений) null и undefined таких оберток нет. И хотя Object(null) и Object(undefined) возвращают просто пустой объект, обратится к методам null и undefined нельзя:
null.property // TypeError: Cannot read property 'property' of null
undefined.property // TypeError: Cannot read property 'property' of undefined
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@eandr_67
web-программист (*AMP, Go, JavaScript, вёрстка).
Потому, что undefined и null - это особые значения (именно значения, а не типы), которые не являются объектами.
Все остальные значения являются объектами или могут быть автоматически преобразованы в объект, но только не undefined и null.
Ответ написан
Комментировать
undefined и null - это на самом деле не типы
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы