let person = { name : 'Linda'}; let members = person; person = null console.log(members)el resultado es {nombre: 'Linda'} pero lo que aprendí sobre el tipo de referencia es que los miembros y la persona tienen la misma dirección de memoria
...pero lo que aprendí sobre el tipo de referencia es que los miembros y la persona tienen la misma dirección de memoria...
Algo así como. Ambos contienen una referencia al mismo objeto, que está en otra parte de la memoria (no literalmente dentro de las variables). (Ya sea que sea literalmente una dirección de memoria o lo que sea que sea un detalle de implementación que no necesita preocuparse, y puede diferir de un motor de JavaScript a otro motor de JavaScript).
Cuando haces person = null , todo lo que estás haciendo es borrar esa referencia de la variable de person . Hacer eso no tiene ningún efecto sobre los members o sobre el objeto al que se refiere.
Hagamos esto paso a paso:
let person = { name : 'Linda'}; Para manejar eso, el motor de JavaScript crea un objeto en la memoria. Ese objeto tendrá algún tipo de forma de referirse a él llamado referencia de objeto. Para nuestros propósitos, digamos que es Ref1234 (ese nombre no tiene un significado subyacente, literalmente lo elegí al azar para tener un nombre para usar):
+−−−−−−−−−−−−−−−+
Ref1234---------------->| (objeto) |
+−−−−−−−−−−−−−−−+
| nombre: "Linda" |
+−−−−−−−−−−−−−−−+
Luego, el motor de JavaScript almacena esa referencia en la variable person :
+−−−−−−−−−−−−−−−+
Ref1234-----------+--->| (objeto) |
| +−−−−−−−−−−−−−−−+
| | nombre: "Linda" |
| +−−−−−−−−−−−−−−−+
persona: Ref1234 −+
Entonces hacemos:
let members = person; Lo que también copia la referencia en person en los members :
+−−−−−−−−−−−−−−−+
Ref1234−−−−−−−−−−−+−+−−>| (objeto) |
| | +−−−−−−−−−−−−−−−+
| | | nombre: "Linda" |
| | +−−−−−−−−−−−−−−−+
persona: Ref1234 −+ |
|
miembros: Ref1234 −−−+
Entonces hacemos:
person = null; Todo lo que hace es poner null en person :
+−−−−−−−−−−−−−−−+
Ref1234-------------+-->| (objeto) |
| +−−−−−−−−−−−−−−−+
| | nombre: "Linda" |
| +−−−−−−−−−−−−−−−+
persona: nula |
|
miembros: Ref1234 −−−+
Eso no cambia nada más en absoluto. Asi que
console.log(members)muestra el objeto.
Si luego hiciste members = null; o la variable de members quedó fuera del alcance sin que ningún cierre la retuviera, etc., y si era lo único que quedaba que contenía Ref1234, entonces el motor de JavaScript podría recolectar elementos no utilizados. Pero eso no sucede cuando haces person = null; porque otra cosa ( members ) tiene una copia de la referencia.
Cuando asigna una persona a los miembros, el miembro almacenará la dirección de la persona en este momento. Luego asigna persona a nulo para que esa persona apunte a otra dirección pero no cambie el valor de la dirección existente. Entonces, los miembros aún conservan la dirección anterior y su valor.