O tratamento de passagem de parâmetros em JavaScript é uma fonte frequente de confusão, frequentemente debatido como passagem por referência ou passagem por valor. A realidade é mais matizada: JavaScript emprega um mecanismo que combina aspectos de ambos, dependendo inteiramente do tipo de dado envolvido.
Sumário
- Entendendo Passagem por Valor com Primitivos
- Compreendendo Passagem por Referência com Objetos
- Reconciliando Passagem por Valor e Passagem por Referência em JavaScript
Entendendo Passagem por Valor com Primitivos
Os tipos de dados primitivos do JavaScript — number
, string
, boolean
, null
, undefined
, bigint
e symbol
— operam usando passagem por valor. Quando um primitivo é passado para uma função, uma cópia do seu valor é criada e passada. Modificações dentro da função afetam apenas esta cópia, deixando a variável original intocada.
let x = 10;
function changeValue(y) {
y = 20;
}
changeValue(x);
console.log(x); // Saída: 10
Neste exemplo, alterar y
dentro de changeValue
não altera o x
original.
Compreendendo Passagem por Referência com Objetos
Objetos em JavaScript (incluindo arrays e funções) se comportam de forma diferente. Quando um objeto é passado para uma função, o que é passado é uma referência — um ponteiro para a localização de memória do objeto. Portanto, quaisquer modificações feitas nas propriedades do objeto *dentro* da função afetam diretamente o objeto original.
let myArray = [1, 2, 3];
function modifyArray(arr) {
arr.push(4);
}
modifyArray(myArray);
console.log(myArray); // Saída: [1, 2, 3, 4]
Aqui, myArray
é modificado porque a função altera o próprio objeto, não uma cópia.
Entretanto, existe uma distinção crucial: atribuir o parâmetro a um objeto *novo* dentro da função não modifica o original.
let myObject = { a: 1 };
function reassignObject(obj) {
obj = { a: 2 }; // Atribuindo um novo objeto
}
reassignObject(myObject);
console.log(myObject); // Saída: { a: 1 }
Dentro de reassignObject
, obj
aponta para um objeto diferente; o myObject
original permanece inalterado.
Reconciliando Passagem por Valor e Passagem por Referência em JavaScript
A passagem de parâmetros em JavaScript não é estritamente uma ou outra. É um sistema dependente do contexto:
- Tipos Primitivos: Passagem por valor. Uma cópia do valor é passada; mudanças internas não afetam o original.
- Objetos: Passagem por referência. Uma referência ao objeto é passada; mudanças nas propriedades do objeto afetam o original. Atribuir o parâmetro a um novo objeto dentro da função deixa o original intocado.
Dominar essa distinção é crucial para escrever código JavaScript robusto e previsível. O comportamento depende inteiramente se você está trabalhando com primitivos ou objetos.