¿Hay algo de lo que deba preocuparme si escribo un código como el siguiente? Siempre me dijeron que reasignar parámetros de función era un gran no-no en Javascript.
function getAddress(address, lowerCase) { address = { ...address } if (lowerCase) { address.line1 = address.line1.toLowerCase(); address.city = address.city.toLowerCase(); } return address; }Ejemplos de consejos:
Desde mi punto de vista, si la dirección es un tipo de datos complejo como un objeto o una matriz, cambiarlo en la función significaría cambiar el objeto original, lo que podría no ser la intención o la necesidad e introducir un error.
Si el parámetro es un tipo de datos primitivo, crearía una copia en el ámbito de la función... por lo que no debería ser un problema
Según tengo entendido, la razón por la que algunos lugares recomiendan no reasignar los parámetros de la función es que hacerlo también cambiará el objeto de arguments , que no es necesariamente el comportamiento esperado. Sin embargo, para las funciones que no usan arguments , esto no debería ser un problema.
Por ejemplo, considere lo siguiente:
function getAddress(address, lowerCase) { address = { ...address }; var originalAddress = arguments[0]; // Do stuff with address } Para alguien que no esté familiarizado con el funcionamiento de JavaScript a este respecto, podría ser razonable suponer que configurar originalAddress de esta manera registraría el primer argumento original que se pasó a la función. Pero en realidad, cuando se reasigna la address , esto también muta el registro relevante en arguments .
Incluso cuando no usa el objeto arguments , puede ser una práctica útil considerar que todos los argumentos de una función son constantes e inmutables, para evitar la posibilidad de introducir errores, como modificar un objeto que se pasa a una función. En su ejemplo, esto podría lograrse así:
function getAddress(addressArg, lowerCase) { const address = { ...addressArg } if (lowerCase) { address.line1 = address.line1.toLowerCase(); address.city = address.city.toLowerCase(); } return address; } En su implementación, siempre que la address solo contenga propiedades primitivas (a diferencia de las propiedades que apuntan a un valor de referencia, como un objeto o una matriz), entonces su copia a través de { ...address } debería crear una copia completamente separada. Sin embargo, este método solo crea una copia superficial.
Si address contiene propiedades de objeto o matriz, pero no propiedades que sean clases o funciones, entonces podría crear una copia profunda a través JSON.parse(JSON.stringify(address)) en su lugar.