DEV Community

Cristian Fernando
Cristian Fernando

Posted on

Paracetamol.js馃拪| #8: 驴Qu茅 imprime este c贸digo JavaScript?

驴Qu茅 imprime este c贸digo JavaScript?

let c = { greeting: "Hey!" };
let d;

d = c;
c.greeting = "Hello";
console.log(d.greeting);
Enter fullscreen mode Exit fullscreen mode
  • A: Hello
  • B: undefined
  • C: ReferenceError
  • D: TypeError

Respuesta en el primer comentario.


Discussion (1)

Collapse
duxtech profile image
Cristian Fernando Author

La respuesta es:

  • A: Hello

Cuando aplicamos el operador de asignaci贸n = entre objetos pensado que as铆 lograremos obtener una copia del mismo estamos cayendo en un error de novato.

Recuerda que los obejetos se manejan segun su referencia y no por su valor como lo hacen los tipos primitivos del lenguaje, esto significa que al hacer esto:

let c = { greeting: "Hey!" };
let d;

d = c;
Enter fullscreen mode Exit fullscreen mode

No solo estamos copiando los valores del objeto c al objeto d sino que tambi茅n copiamos su referencia en memoria. Esta referencia es la direcci贸n donde dicho objeto se almacener谩 en el disco duro del ordenador; en JavaScript al ser un lenguaje de alto nivel no podemos acceder a dichas direcciones como en lenguajes de bajo nivel como por ejemplo lenguaje ensamblador.

Dicho en otras palabras, las direcciones de memoria del objeto c y del objeto d son las mismas, apuntan a la misma direcci贸n, por ello, cuando intentamos modificar el objeto c:

c.greeting = "Hello";
Enter fullscreen mode Exit fullscreen mode

En realidad, estamos modificando ambos objetos.


Para crear copias de objetos de manera segura se recomienda usar el spread operator con su sintaxis de tres puntos ...

let c = { greeting: "Hey!" };
let d;

d = {...c};

c.greeting = "Hello";
console.log(d.greeting); // Hey!
console.log(c.greeting); // Hello
Enter fullscreen mode Exit fullscreen mode

Este m茅todo solo sirve para copiar objetos en el primer nivel, si deseamos realizar copias de objetos anidados se puede recurrir a otras alternativas como por ejemplo JSON.stringify.