Dentro de la sección Términos y definiciones de ECMAScript 2021 Language Specification, un objeto ordinario se define como:
objeto que tiene el comportamiento predeterminado para los métodos internos esenciales que deben ser compatibles con todos los objetos
Un objeto estándar se define como:
objeto cuya semántica está definida por esta especificación
Después de leer ambas definiciones, inmediatamente me pregunté: "¿No se define también en esta especificación el comportamiento predeterminado de los métodos internos esenciales que deben ser compatibles con todos los objetos?"
Intenté buscar en la especificación ambos términos, pero hay más de 100 coincidencias para 'objeto ordinario' y solo unas pocas referencias para 'objeto estándar', lo que no proporcionó un contexto adicional que aclarara la distinción entre estos términos. yo. También probé la búsqueda en Google y ninguno de los resultados parece relevante para mi pregunta.
¿Cuál es la diferencia entre un objeto ordinario y un objeto estándar? ¿Cuál es un ejemplo de un escenario en el que es útil distinguir entre estos dos tipos de objetos?
Sí, todo objeto ordinario es también un objeto estándar.
El término objeto ordinario se contrasta con un objeto exótico , que tiene implementaciones no predeterminadas de los métodos de objetos internos. Ejemplos de objetos exóticos estándar son proxies, matrices y funciones enlazadas.
El término objeto estándar (anteriormente también conocido como " objeto nativo ", lo que generó mucha confusión ) se contrasta con un objeto host o un objeto definido por la implementación , que se especifican mediante una especificación diferente (por ejemplo, HTML5) o se implementan en el motor. sin una especificación formal. Estas pueden ser funciones (que por lo demás son ordinarias) con un comportamiento de llamada definido por el host (p. ej., console.log , setTimeout , etc.) u objetos totalmente exóticos ( document.all , nodelists, etc.); consulte las API web para obtener una descripción general de las funciones definidas por el navegador. objetos. Otros entornos proporcionarán otros objetos definidos por el host.
Los objetos ordinarios (con un comportamiento estándar y predeterminado) cuya existencia se rige por la implementación del host o el estándar que no es ECMAScript pueden clasificarse como cualquiera, supongo.
Solo como referencia, la última distinción que es relevante para esta discusión de terminología es entre objetos incorporados ( también incorporados ) y objetos definidos por el usuario . Los primeros son creados por la implementación al inicio, proporcionando el entorno con el que el código de usuario puede interactuar. Estos últimos son construidos por código de usuario en tiempo de ejecución. Desafortunadamente, se convierte en un área gris cuando los objetos exóticos se construyen mediante código nativo (que no es de usuario), a veces también se les llama "incorporados".
Consulte también ¿Cuál es la diferencia entre los objetos nativos y los objetos host? y en ECMAScript, ¿cómo se integran también algunos de los objetos nativos? .
const user = { firstname: "Jonas" }; Ese es un objeto ordinario (ya que no es exótico ), sin embargo, no es un objeto estándar , ya que la semántica la defino yo y no la especificación. Su comportamiento, sin embargo, está especificado (p. ej., user.firstname se evaluará como "Jonas" ).