El manejo de paso de parámetros en JavaScript es una fuente frecuente de confusión, a menudo debatida como paso por referencia o paso por valor. La realidad es más matizada: JavaScript emplea un mecanismo que combina aspectos de ambos, dependiendo completamente del tipo de datos involucrado.
Tabla de Contenido
- Entendiendo el Paso por Valor con Primitivos
- Comprendiendo el Paso por Referencia con Objetos
- Reconciliando el Paso por Valor y el Paso por Referencia en JavaScript
Entendiendo el Paso por Valor con Primitivos
Los tipos de datos primitivos de JavaScript —number
, string
, boolean
, null
, undefined
, bigint
, y symbol
— operan usando paso por valor. Cuando un primitivo se pasa a una función, se crea una copia de su valor y se pasa. Las modificaciones dentro de la función afectan solo a esta copia, dejando la variable original intacta.
let x = 10;
function changeValue(y) {
y = 20;
}
changeValue(x);
console.log(x); // Salida: 10
En este ejemplo, cambiar y
dentro de changeValue
no altera la x
original.
Comprendiendo el Paso por Referencia con Objetos
Los objetos en JavaScript (incluyendo arrays y funciones) se comportan de manera diferente. Cuando un objeto se pasa a una función, lo que se pasa es una referencia —un apuntador a la ubicación de memoria del objeto. Por lo tanto, cualquier modificación hecha a las propiedades del objeto *dentro* de la función afecta directamente al objeto original.
let myArray = [1, 2, 3];
function modifyArray(arr) {
arr.push(4);
}
modifyArray(myArray);
console.log(myArray); // Salida: [1, 2, 3, 4]
Aquí, myArray
se modifica porque la función altera el objeto en sí, no una copia.
Sin embargo, existe una distinción crucial: reasignar el parámetro a un objeto *nuevo* dentro de la función no modifica el original.
let myObject = { a: 1 };
function reassignObject(obj) {
obj = { a: 2 }; // Asignando un nuevo objeto
}
reassignObject(myObject);
console.log(myObject); // Salida: { a: 1 }
Dentro de reassignObject
, obj
apunta a un objeto diferente; el myObject
original permanece sin cambios.
Reconciliando el Paso por Valor y el Paso por Referencia en JavaScript
El paso de parámetros de JavaScript no es estrictamente uno u otro. Es un sistema dependiente del contexto:
- Tipos Primitivos: Paso por valor. Se pasa una copia del valor; los cambios internos no afectan al original.
- Objetos: Paso por referencia. Se pasa una referencia al objeto; los cambios en las propiedades del objeto afectan al original. Reasignar el parámetro a un nuevo objeto dentro de la función deja el original intacto.
Dominar esta distinción es crucial para escribir código JavaScript robusto y predecible. El comportamiento depende completamente de si se está trabajando con primitivos u objetos.