recorrer - manipular imagenes con javascript
¿El objeto copiado en la segunda propiedad a través de la referencia persiste incluso después de que se eliminó la propiedad original? (6)
Pensé que los objetos se pasan como referencia. Pero cuando borro b
, todavía existe en c
. Por favor vea este ejemplo:
Esta primera parte tiene sentido para mí, ya que se pasa por referencia:
var a = {b: {val:true}};
a.c = a.b;
a.b.val = ''rawr'';
console.log(uneval(a)); // outputs: "({b:{val:"rawr"}, c:{val:"rawr"}})"
Ahora esta parte no tiene sentido para mí:
var a = {b: {val:true}};
a.c = a.b;
a.b.val = ''rawr'';
delete a.b;
console.log(uneval(a)); // outputs: "({c:{val:"rawr"}})"
por lo tanto, la propiedad b
se elimina, pero la propiedad c
mantiene las propiedades a lo que se hace referencia antes de eliminar. ¿Es este un error en javascript?
Edición: gracias a todos por las respuestas! así que no es un error, y este comportamiento es realmente muy bueno, ¡permite a las personas cambiar los nombres de "clave" / "propiedad" mientras retienen el objeto! :)
... llego tarde a la fiesta? Aquí está mi opinión sobre cómo explicarlo (lea también las otras respuestas, esto es solo para respaldar esas respuestas con una representación visual):
- Inicialización del objeto vacío
a
con otro objeto (value:true
).
- Asignando el objeto vacío
a
con una propiedadb
refiriéndose al otro objeto (value:true
).
- Asignando el objeto
a
con una propiedadc
refiriéndose al mismo objeto (value:true
).
- La eliminación de la clave
b
, por lo tanto,ab
ya no hace referencia al subobjeto (value:true
).
- Representación final del objeto principal
a
.
Así que podemos ver fácilmente mediante representación visual cómo se estaba preservando el subobjeto :)
Con esta línea, piensas que c apunta a b:
a.c = a.b;
pero en realidad, tanto c como b apuntan al objeto {val: true}, por lo que si elimina b, el objeto permanece. puede pensar simplemente que tanto c como b son simplemente "la etiqueta" está pegada en el objeto {val: true}
Eso es porque:
El operador de eliminación elimina una propiedad de un objeto. Eliminar MDN
La entrada b
que corresponde al Object {val: true}
se elimina de a
. La entrada c
en a
alambique se refiere a este objeto. Si intenta eliminar c.val
o abval
, todavía puede ver el efecto en cascada al otro.
Lo que estás tratando de hacer, es decir, desasignar datos y esperar que se coloquen en cascada, no sucede en javascript. Si tiene un fondo de C ++, considere pensar en todos los objetos de javascript como referencias contabilizadas. Puedo eliminar una referencia a él (es decir, la entrada que ''apunta'' a este objeto), pero no puedo eliminar el objeto en sí. Esa es la prerrogativa pura del motor javascript.
Hay dos cosas que se deben tener en cuenta: primero, como se dijo en otras respuestas, la palabra clave delete elimina una propiedad solo para el objeto a través del cual se accede a la propiedad.
La segunda cosa a tener en cuenta es que JavaScript nunca pasa por referencia, nunca. Siempre pasa como un valor, los valores son a veces referencias.
Por ejemplo:
var a = {
someObject: {}
};
var someObject = a.someObject;
someObject = ''Test'';
console.log(a.someObject); // outputs {}
En un lenguaje que pasa por referencia, esto probablemente causaría un error porque a menudo implica una fuerte tipificación de variables.
No, esto no es un error en JavaScript.
Lo que está haciendo con ac = ab
es que está creando otro enlace al mismo objeto, lo que significa que tanto ab
como ac
hacen referencia al mismo subobjeto {val: "rawr"}
.
Cuando delete ab
, no está eliminando el subobjeto, solo está eliminando la propiedad ab
de a
. Esto significa que ac
todavía hará referencia al mismo objeto.
Si también eliminara la propiedad ac
, entonces el subobjeto desaparecerá.
No, no es un error.
El comando de delete
no elimina el objeto al que hace referencia la propiedad, solo elimina la propiedad. Si se hace referencia al objeto desde otro lugar (la otra propiedad en este caso), el objeto aún está vivo.
Esto es lo mismo que si tiene dos variables que apuntan al mismo objeto y cambia el valor de una variable:
var a = { val: true };
var b = a;
a = null;
console.log(b.val); // b still has a reference to the object