Mutabilidad e Inmutabilidad en JavaScript: Guía Completa con Ejemplos Prácticos
Mutabilidad e Inmutabilidad
- Mutabilidad: Un objeto mutable es aquel cuyo estado o contenido puede ser modificado después de su creación.
- Inmutabilidad: Un objeto inmutable es aquel cuyo estado o contenido no puede ser modificado después de su creación.
Datos Primitivos
En JavaScript, los datos primitivos son inmutables. Los tipos de datos primitivos incluyen Number
, String
, Boolean
, Undefined
, Null
, Symbol
y BigInt
.
Ejemplo de Inmutabilidad en Datos Primitivos
let x = 10;
x = 20; // Aunque reasignamos x, estamos creando un nuevo valor 20 en memoria y x ahora apunta a ese nuevo valor.
let str = "Hola";
str = "Mundo"; // De nuevo, se crea una nueva cadena "Mundo" y str ahora apunta a esta nueva cadena.
En los ejemplos anteriores, aunque parece que estamos modificando el valor de x
y str
, en realidad estamos creando nuevos valores y cambiando las referencias.
Datos de Referencia
En JavaScript, los datos de referencia (objetos y arrays) son mutables. Esto significa que podemos cambiar sus propiedades o elementos después de haber sido creados.
Ejemplo de Mutabilidad en Datos de Referencia
Objetos
let persona = {
nombre: "Juan",
edad: 30
};
persona.edad = 31; // Modificamos la propiedad edad del objeto persona.
persona.nombre = "Pedro"; // Modificamos la propiedad nombre del objeto persona.
console.log(persona); // { nombre: "Pedro", edad: 31 }
Arrays
let numeros = [1, 2, 3];
numeros.push(4); // Añadimos un nuevo elemento al array.
numeros[0] = 10; // Modificamos el primer elemento del array.
console.log(numeros); // [10, 2, 3, 4]
En estos ejemplos, modificamos directamente los datos dentro de los objetos y arrays sin cambiar su referencia.
Inmutabilidad en Datos de Referencia
Aunque los datos de referencia son inherentemente mutables, podemos aplicar técnicas para trabajar con ellos de manera inmutable. Esto es útil para evitar efectos secundarios y mejorar la predictibilidad del código.
Ejemplo de Inmutabilidad en Datos de Referencia
Objetos
let persona = {
nombre: "Juan",
edad: 30
};
// Creamos un nuevo objeto con propiedades modificadas
let nuevaPersona = { ...persona, edad: 31, nombre: "Pedro" };
console.log(persona); // { nombre: "Juan", edad: 30 }
console.log(nuevaPersona); // { nombre: "Pedro", edad: 31 }
Arrays
let numeros = [1, 2, 3];
// Creamos un nuevo array con un elemento adicional
let nuevosNumeros = [...numeros, 4];
// Creamos un nuevo array con el primer elemento modificado
let otrosNumeros = [10, ...numeros.slice(1)];
console.log(numeros); // [1, 2, 3]
console.log(nuevosNumeros); // [1, 2, 3, 4]
console.log(otrosNumeros); // [10, 2, 3]
Cuándo Utilizar Mutabilidad e Inmutabilidad
Mutabilidad
Cuándo usarla:
- Cuando necesitas modificar un objeto o array en su lugar.
- Cuando trabajas con grandes estructuras de datos y necesitas eficiencia de memoria.
Ventajas:
- Eficiencia de memoria y rendimiento.
- Modificación directa de estructuras de datos.
Desventajas:
- Mayor riesgo de efectos secundarios no deseados.
- Dificultad en el seguimiento de cambios en estructuras de datos complejas.
Inmutabilidad
Cuándo usarla:
- Cuando necesitas asegurar que el estado no cambia inadvertidamente.
- En aplicaciones de estado predecible (como Redux en React).
- Para facilitar el seguimiento de cambios y depuración.
Ventajas:
- Menor riesgo de efectos secundarios no deseados.
- Facilita la depuración y el mantenimiento del código.
- Ideal para programación funcional y concurrencia.
Desventajas:
- Puede ser menos eficiente en términos de memoria y rendimiento.
- Requiere crear copias de estructuras de datos, lo que puede ser costoso.
Conclusión
Entender la diferencia entre mutabilidad e inmutabilidad es crucial para escribir código JavaScript eficiente y mantenible. Mientras que los datos primitivos son siempre inmutables, los datos de referencia son mutables por defecto, pero se pueden manipular de manera inmutable utilizando técnicas adecuadas. Escoger cuándo usar cada enfoque depende del contexto y los requisitos específicos del proyecto.