DEV Community

Daniel Nieto
Daniel Nieto

Posted on • Edited on

Comprendiendo la copia profunda en JavaScript

JavaScript no necesita presentaciones, es un lenguaje robusto con mucha versatilidad, pero si has trabajado con él, probablemente hayas notado algunos comportamientos inusuales. Uno de ellos es cómo JavaScript maneja las copias de variables, particularmente cuando trabajamos con objetos. En este artículo, exploraremos el concepto de copia profunda y cómo nos ayuda a evitar problemas inesperados al duplicar datos en nuestros programas.

Cuando hacemos una copia de una variable, JavaScript crea un nuevo espacio de memoria y allí guarda el valor copiado; luego, la nueva variable apunta a este nuevo espacio de memoria. Por ejemplo:

x = 5;
y = x;
Enter fullscreen mode Exit fullscreen mode

y está apuntando a un nuevo espacio de memoria, el cual tiene el mismo valor que x, es decir, 5. Visualmente, sería algo como esto:

x point to A2 address and y point to A3 address

El concepto anterior se aplica solo a valores primitivos, para los objetos es diferente. Imagina que tenemos los siguientes dos objetos:

let a = {
    name: 'Rick',
    lastName: 'Sanchez',
};

let b = a;
Enter fullscreen mode Exit fullscreen mode

En el ejemplo anterior, b no tiene su propio espacio de memoria como podríamos esperar; en lugar de eso, b está apuntando al espacio de memoria donde a está guardado.

variables a and b point to same A8 address

¿Qué problemas podría causar este comportamiento? Básicamente, si cambias cualquier campo de a o b, ambas variables cambiarán. Ejecuta el siguiente código y verifícalo tú mismo.

let a = {
    name: 'Rick',
    lastName: 'Sanchez',
};

let b = a;

b.name = 'Morty';

console.log('a: ', a); // a:  { name: 'Morty', lastName: 'Sanchez' }
console.log('b: ', b); // b:  { name: 'Morty', lastName: 'Sanchez' }
Enter fullscreen mode Exit fullscreen mode

¿La solución para esto? Necesitamos hacer una copia profunda para guardar el valor de a en un nuevo espacio de memoria independiente al que b apunta.

const b = JSON.parse(JSON.stringify(a));
Enter fullscreen mode Exit fullscreen mode

De esta manera, estamos forzando a JavaScript a crear un nuevo espacio de memoria al cambiar el formato de Objeto a JSON. Esto se hace utilizando el método stringify, luego el JSON con su propio espacio de memoria se convierte nuevamente en un Objeto con el método parse, por lo que ambas variables permanecen totalmente independientes.

¿Te ha ocurrido alguna vez este extraño comportamiento? Házmelo saber en los comentarios, ¡estaré encantado de leerte!

Top comments (2)

Collapse
 
bernardao profile image
Iago • Edited

Gracias por el artículo. Creo que hay una errata en el siguiente párrafo

En el ejemplo anterior, b no tiene su propio espacio de memoria como podríamos esperar; en lugar de eso, a está apuntando al espacio de memoria donde a está guardado.

Debería ser:

En el ejemplo anterior, b no tiene su propio espacio de memoria como podríamos esperar; en lugar de eso, b está apuntando al espacio de memoria donde a está guardado.

Collapse
 
daniel1775 profile image
Daniel Nieto • Edited

Tienes razón, gracias por la observación