Te damos la bienvenida a proyecto on line, en este sitio vas a hallar la resolución a lo que necesitas.
Solución:
La respuesta realmente breve a ambas preguntas es que cuando haces que una variable sea igual a otra, se hace una COPIA de lo que hay en la primera variable y se almacena en la segunda variable – no hay vinculación entre las dos variables.
Pero, siga leyendo para obtener más detalles y por qué puede parecer que hay un vínculo en algunos casos…
JavaScript, como muchos lenguajes, divide los datos en dos amplias categorías: tipos de valor y tipos de referencia. Los tipos de valor de JavaScript son sus primitivos:
- string
- número
- booleano
- null
- indefinido
- símbolo
Cuando asigna cualquiera de estos tipos a una variable, los datos reales se almacenan en esa variable y si establece una variable igual a otra, un copiar (no un enlace) de la primitiva se hace y almacena en la nueva variable:
var a = 10; // Store the actual number 10 in the a variable
var b = a; // Store a COPY of the actual number stored in a (10) in the b variable
a = 50; // Change the actual data stored in a to 50 (no change to b here)
console.log(b); // 10
cuando trabajas con tipos de referencia, sucede algo un poco diferente. Asignar una variable a un tipo de referencia significa que la variable solo contiene una referencia a la ubicación de la memoria donde se almacena realmente el objeto, no el objeto real en sí. Entonces, cuando haces esto:
var a = foo:"bar";
a
en realidad no almacena el objeto en sí, solo almacena la ubicación de memoria donde se puede encontrar el objeto (es decir, 0x3C41A).
Pero, en cuanto a establecer otra variable igual a la primera, todavía funciona como lo hizo con los primitivos – – a Copiar de lo que está en la primera variable se hace y se le da a la segunda variable.
Aquí hay un ejemplo:
// An object is instantiated in memory and a is given the address of it (for example 0x3C41A)
var a = ;
// The contents of a (the memory location of an object) is COPIED into b.
// Now, both a and b hold the same memory location of the object (0x3C41A)
var b = a;
// Regardless of whether a or b is used, the same underlying object
// will be affected:
a.foo = "test";
console.log(b.foo); // "test"
// If one of the variables takes on a new value, it won't change
// what the other variable holds:
a = "something else";
console.log(b); // The object stored in memory location (0x3C41A)
Entonces, en sus primeras pruebas, simplemente tiene dos formas de acceder a un objeto y luego cambia lo que a
está reteniendo (la ubicación de memoria del objeto) a un objeto diferente y, por lo tanto, ahora solo le queda una forma de acceder al objeto original, a través de b
.
Si tratamos de “despejar”
a
a través del establecimientoa =
, objetob
permanecerá sin cambios. No entiendo por qué manipular un objeto de esta manera produce un resultado diferente al del primer ejemplo.
porque ahora sabemos que a =
no está limpiando el objeto. solo esta apuntando a
en otra cosa
Déjame intentar explicar:
1) En tu ejemplo a
y b
son referencias a un mismo objeto, mientras que a.fname
(o b.fname
) es un attribute de ese objeto. Así que al manipular el attribute se cambiará en el objeto, mientras que las referencias no se verán afectadas, seguirán apuntando al mismo objeto, el objeto en sí se ha cambiado. a =
por otro lado, simplemente reemplazará la referencia al objeto sin afectar el objeto en sí o b
La referencia de It.
No hay autorización por cierto, acaba de crear una nueva referencia a un nuevo objeto vacío.
2) Estos no son objetos, por lo que no hay referencia de que esté manipulando directamente los valores. Esto se debe a que existe una diferencia entre los objetos y las primitivas que puede resultar confuso, especialmente al principio, si no está acostumbrado a trabajar con tipos estrictos.
Sección de Reseñas y Valoraciones
Tienes la opción de añadir valor a nuestro contenido participando con tu veteranía en las notas.