В чем разница между «стандартным объектом» и «обычным объектом» в ECMAScript?

В разделе терминов и определений спецификации языка ECMAScript 2021 обычный объект определяется как:

объект, который имеет поведение по умолчанию для основных внутренних методов, которые должны поддерживаться всеми объектами

Стандартный объект определяется как:

объект, семантика которого определяется данной спецификацией

Прочитав оба определения, я сразу же спросил себя: «Разве поведение по умолчанию основных внутренних методов, которые должны поддерживаться всеми объектами, также не определены в этой спецификации?»

Я попытался выполнить поиск в спецификации для обоих терминов, но есть более 100 совпадений для «обычного объекта» и лишь несколько ссылок для «стандартного объекта», которые не обеспечивают дополнительного контекста, который делает различие между этими терминами ясным для меня. Я также пробовал искать в Google, и ни один из результатов не соответствует моему вопросу.

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

2 ответа

Да, каждый обычный объект также является стандартным объектом.

Термин « обычный объект » противопоставляется « экзотическому объекту », который имеет нестандартные реализации методов внутреннего объекта. Примерами стандартных экзотических объектов являются прокси, массивы и связанные функции.

Термин « стандартный объект » (ранее также известный как « собственный объект », что приводило к большой путанице ) противопоставляется хост-объекту или объекту, определяемому реализацией , которые указаны в другой спецификации (например, HTML5) или реализованы в движке. без формальной спецификации. Это могут быть функции (в остальном обычные) с поведением вызова, определяемым хостом (например, console.log, setTimeoutи т.д.) или совершенно экзотические объекты ( document.all, нодлисты и т. д.) — обзор объектов, определяемых браузером, см. в веб-API .Другие среды будут предоставлять другие объекты, определенные хостом.

Обычные объекты (со стандартным поведением по умолчанию), существование которых регулируется реализацией хоста или стандартом, отличным от стандарта ECMAScript, могут быть классифицированы как и то, и другое.

Просто для справки: последнее различие, имеющее отношение к этому обсуждению терминологии, — это встроенные объекты ( также встроенные ) и определяемые пользователем объекты . Первые создаются реализацией при запуске, предоставляя среду, с которой может взаимодействовать пользовательский код. Последние создаются пользовательским кодом во время выполнения. К сожалению, это становится серой зоной, когда экзотические объекты создаются с помощью собственного (непользовательского) кода, их также иногда называют «встроенными».

См. также В чем разница между собственными объектами и хост-объектами?и как в ECMAScript встроены некоторые нативные объекты?.

       const user = { firstname: "Jonas" };

Это обычный объект (поскольку он не экзотичен ), однако это не стандартный объект , так как семантика определяется мной, а не спецификацией. Однако его поведение специфицируется (например, user.firstnameбудет оценивать "Jonas").

Другие вопросы по тегам