Inmutabilidad y const

Primero fue let, y poco después const. Estos son los dos nuevos var que se han puesto de moda para definir variables en Javascript. Desde hace algún tiempo, con la moda funcional ha venido la ola de lo inmutable. El problema es cuando repetimos lo que dicen otros sin entenderlo. O peor aún sacamos conclusiones de una lectura rápida y nos convertimos en evangelistas de algo que no tiene ningún sentido.

Al contrario de lo que muchos piensan

const a = 3;

Declarar a con const no hace el valor de a inmutable. De hecho en este caso, 3 es "inmutable" por ser un valor primitivo.

Pero ¿es el valor de b inmutable en este otro caso?

const b = [1, 2, 3];

Probemos:

b.push(4); // [1, 2, 3, 4]
b[0] = 10; // [10, 2, 3, 4]

Mmmm, parece que es mutable.

Lo único que hace const es evitar que b sea reasignada. Nada más. Por cierto, esto no sólo afecta a los arrays, también afecta a cualquier valor que sea un objeto. const no evita que mutemos las propiedades de un objeto.

Algunos defienden que todo debe ser declarado con const para evitar que alguien reasigne la variable por accidente, especialmente posibles programadores recién llegados a javascript que podrían trabajar en el mismo proyecto y no conocer las peculiaridades de javascript. Pero cuando declaramos algo con const esa declaración sólo es válida dentro del bloque en el que ocurre:

function hacerAlgo() {
    const b = [1, 2, 3];
    // hacer algo con b en unas pocas líneas
    return b;
}

Si estamos haciendo las cosas bien, en la mayoría de los casos, la función hacerAlgo, o cualquier otro bloque dentro del que declaremos b, no debería tener más de una docena de sentencias. ¿De verdad vamos a usar const como el nuevo var para evitar reasignaciones dentro de un bloque de unas pocas líneas?

La cosa es todavía más ridícula cuando nos damos cuenta de que el valor que retorna hacerAlgo no es inmutable. Es más, si otro programador asigna el retorno de hacerAlgo a una variable usando let o var esa variable será reasignable dentro de su ámbito.

Los argumentos a favor de const no se sostienen. Además, potencialmente genera más confusión de la que evita. En mi diccionario, const, es una abreviatura de constante. Algo que es constante no debería poder variar su valor. Los valores declarados con const son variables a no ser que sean valores primitivos.

La otra moda que se ha extendido es declarar funciones como expresiones asignándolas a una variable declarada con const.

const hacerAlgo = function() {
	const b = [1, 2, 3];
    // hacer algo con b en unas pocas líneas
    return b;
};

Otro sinsentido en mi opinión. No solo creamos confusión en el recién llegado. ¿Qué va a pensar? ¿Que el valor devuelto es constante? ¿Qué es inmutable?

Además, estamos haciendo la declaración de variables vulnerable a posibles bugs debidos al izado de variables (hoisting) y obligándonos a declarar todas las funciones al principio del bloque para evitar problemas.

Francamente no veo el beneficio por ningún lado, y espero que esta moda se desvanezca como otras. Yo preferiría que mandáramos un mensaje claro a los demás programadores, "¡Aprende bien javascript antes de usarlo! Me da igual que sepas Java, o C++. No tiene nada que ver con esos lenguajes".

El único uso legítimo que le veo a const es para declarar constantes globales dentro de un módulo, cuando realmente son constantes. Pi es una constante, el número aureo es una constante, G en la ley de Newton lo es también, … las cadenas de texto que podemos usar para comparar en un bloque switch pueden ser constantes, y poco más.

Por cierto, la única manera nativa de hacer un valor realmente inmutable en Javascript es usar Object.freeze().

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.