Aikido

Por qué no deberías sobrescribir los argumentos de una función: previniendo confusiones y problemas de depuración

Legibilidad

Regla

No anular función argumentos.
Reasignación de función parámetros puede confundir a
las personas que llaman y hacer depuración la depuración.

Idiomas admitidos: 45+

Introducción

Reasignar parámetros de función cambia el valor de los argumentos dentro de la función, lo que dificulta saber qué valor tiene el parámetro en un momento dado. Al depurar, no se puede confiar en que un parámetro siga conteniendo el valor pasado por quien lo invoca. Esto genera confusión para cualquiera que lea el código y complica la localización de errores, ya que el valor del parámetro cambia a lo largo de la ejecución.

Ejemplos de código

❌ No conforme:

function processUser(user) {
    if (!user) {
        user = { id: null, name: 'Guest' };
    }

    user = { ...user, processedAt: Date.now() };

    if (user.age < 18) {
        user = { ...user, restricted: true };
    }

    return user;
}

Por qué es incorrecto: El usuario el parámetro se reasigna varias veces, lo que hace imposible saber qué pasó el llamador original sin leer toda la función. La depuración muestra valores modificados, no la entrada real, lo que dificulta rastrear los problemas hasta su origen.

✅ Conforme:

function processUser(user) {
    const currentUser = user || { id: null, name: 'Guest' };

    const processedUser = {
        ...currentUser,
        processedAt: Date.now()
    };

    if (currentUser.age < 18) {
        return { ...processedUser, restricted: true };
    }

    return processedUser;
}

¿Por qué esto importa? Nuevas variables (currentUser, processedUser) retienen valores intermedios mientras que el original usuario el parámetro permanece sin cambios. Los depuradores muestran el valor de entrada real, y el código rastrea claramente las transformaciones a través de variables con nombre.

Conclusión

Utilice nuevas variables para las transformaciones en lugar de reasignar parámetros. Esto hace explícito el flujo de datos y preserva la entrada original para la depuración. La ligera verbosidad de las declaraciones de variables adicionales se ve compensada por una mejor legibilidad y capacidad de depuración.

Preguntas frecuentes

¿Tiene preguntas?

¿Qué pasa con los valores de parámetro predeterminados?

Los parámetros por defecto (función process(user = {})) son diferentes de la reasignación. Solo proporcionan valores cuando los argumentos son indefinidos, no reasignan parámetros existentes. Utilice parámetros por defecto para argumentos opcionales, pero no los reasigne dentro del cuerpo de la función.

¿Esto se aplica a parámetros primitivos vs. de objeto?

Sí, ambos. Reasignar primitivas (números, cadenas) cambia la referencia local y crea confusión. Reasignar objetos reemplaza completamente la referencia, aunque mutar propiedades de objetos (user.name = 'x') es un tema aparte sobre la inmutabilidad.

¿Qué ocurre si necesito normalizar o limpiar la entrada?

Crea una nueva variable para el valor normalizado: const cleanedInput = normalizeInput(input). Esto deja claro que la función transforma la entrada y muestra tanto los valores originales como los limpios durante la depuración.

¿Qué hay de modificar las propiedades de los parámetros?

Modificar propiedades (user.name = 'x') es diferente de reasignar el parámetro en sí. Sin embargo, mutar parámetros también es problemático, ya que crea efectos secundarios. Es preferible tratar los parámetros como inmutables y devolver nuevos objetos con los cambios.

Asegúrate ahora.

Proteja su código, la nube y el entorno de ejecución en un único sistema central.
Encuentre y corrija vulnerabilidades de forma rápida y automática.

No se requiere tarjeta de crédito | Resultados del escaneo en 32 segundos.