ecmascript - javascript download
¿Cómo explicar las referencias de objetos en términos ECMAScript? (1)
¿Dónde dice la especificación que los valores del tipo de Objeto se comportan de manera diferente a los primitivos? ¿Es solo que los primitivos son inmutables, y los objetos son mutables?
Sí, básicamente se reduce a la mutabilidad de los objetos y la identidad de los objetos . En realidad, esto no se especifica en ninguna parte, solo se asume como una idea central dada de la programación orientada a objetos. La única mención al respecto es un comentario en el Anexo E , que dice que " el cambio [de los valores de expresión literal de expresiones regulares] es detectable por cualquier programa que pruebe la identidad del objeto de dichos valores literales o que sea sensible a los efectos secundarios compartidos " .
Incluso la mutabilidad de los objetos en ninguna parte expresada explícitamente, pero implícita en frases como " En ECMAScript, el estado y los métodos son transportados por los objetos ", " Un objeto ECMAScript es una colección de propiedades " y nociones severas de "cambios" en los valores de las propiedades ". creando "propiedades o" configuración "de atributos de propiedad (en el método [[DefineOwnProperty]] ).
Lo pregunto porque siempre hablamos de "referencias de objetos" y "valores de referencia" cuando intentamos explicar el comportamiento de los objetos, pero no pude encontrar nada similar a eso en la especificación.
Esto se debe a que la especificación no es una guía para el lenguaje y una explicación de sus características, sino simplemente una especificación de sus características (internas). Se espera que el lector sepa OOP y sus ideas.
De hecho, el lenguaje siempre habla solo de valores, independientemente de que puedan ser valores u objetos primitivos. Las únicas cosas que pueden ser mutadas por las herramientas del lenguaje son la vinculación de Registros del entorno (variables) y las propiedades Objetos, todo lo demás (incluida la identidad del objeto) se considera inmutable implícitamente.
Cuando intentamos explicar el "comportamiento de los objetos", básicamente explicamos el concepto de la identidad de los objetos. Por lo general, la audiencia proviene de idiomas de bajo nivel, no OOP, donde las asignaciones se copian de forma predeterminada, y los valores compartidos se realizan mediante punteros (referencias). Para ellos, explicamos los objetos como una " referencia a la colección de propiedades ", y todas las apariencias de un objeto son referencias que apuntan a la misma colección. No hay una forma integrada para copiar la colección.
Sin embargo, para enfatizar la falta de referencias en general 1 (no se puede hacer una referencia a un enlace de identificador, es decir, una variable, independientemente de su tipo de valor) y para cumplir con la redacción oficial, también usamos el término valor para todo. Esto acuñó el término "valor de referencia" para los objetos.
Además, la redacción en el Algoritmo de igualdad / igualdad coincide con esto: " donde x
e y
son valores , ..., [cuando ambos son de tipo Objeto], ..., devuelve true
si x
e y
refieren al mismo objeto " .
1. En realidad, la especificación describe las References como un tipo de especificación . Indican las propiedades de los objetos, y se utilizan para describir el comportamiento de la delete
, las asignaciones de propiedades, las llamadas a métodos, etc. Sin embargo, no se pueden transferir (asignación, función de llamada), son solo internas y no se pueden obtener , y no apuntan a variables. . Aún así, no hay una forma integrada de adquirir algún tipo de puntero a una variable local.
Considera esto:
var a = {}, b = a;
En términos de la especificación, b = a
reduce a PutValue(b, GetValue(a))
, ¿verdad? Y GetValue(a)
usa la operación abstracta GetBindingValue("a", strictFlag)
, que devuelve "el valor" en a
. Y "el valor" es "el objeto" originalmente asignado a a
. Entonces "el objeto" se almacena en b
, al igual que cualquier otro valor.
Pero ¿qué es precisamente "el objeto"? ¿Dónde dice la especificación que los valores del tipo de Objeto se comportan de manera diferente a los primitivos? ¿Es solo que los primitivos son inmutables, y los objetos son mutables?
Lo pregunto porque siempre hablamos de "referencias de objetos" y "valores de referencia" cuando intentamos explicar el comportamiento de los objetos, pero no pude encontrar nada similar a eso en la especificación.