Em JavaScript, o conceito de “passagem por referência” (ou “cópia por referência”) é um pouco diferente do que em outras linguagens de programação. Isso ocorre porque em JavaScript, os objetos são passados por referência, enquanto os tipos primitivos são passados por valor.
Quando uma variável que contém um objeto é passada como argumento para uma função, é a referência ao objeto que é passada, não uma cópia do objeto em si. Isso significa que, dentro da função, se você modificar o objeto referenciado pela variável, essas modificações serão refletidas fora da função, já que ambas estão apontando para o mesmo objeto na memória.
Vamos exemplificar isso:
javascript// Definindo uma função para modificar um objeto
function modificarObjeto(obj) {
obj.propriedade = 'nova valor';
}
// Definindo um objeto
let meuObjeto = { propriedade: 'valor inicial' };
// Chamando a função e passando o objeto como argumento
modificarObjeto(meuObjeto);
// Imprimindo o objeto após a chamada da função
console.log(meuObjeto); // Saída: { propriedade: 'nova valor' }
Como podemos ver, a função modificarObjeto
recebeu o objeto meuObjeto
como argumento e modificou uma de suas propriedades. Após a chamada da função, quando imprimimos meuObjeto
, vemos que a modificação feita dentro da função foi refletida fora dela.
No entanto, quando lidamos com tipos primitivos, como números e strings, a passagem é por valor. Isso significa que uma cópia do valor é passada para a função, e quaisquer modificações feitas dentro da função não afetam a variável original.
Vejamos um exemplo:
javascript// Definindo uma função para modificar uma string
function modificarString(str) {
str = 'nova string';
}
// Definindo uma string
let minhaString = 'string inicial';
// Chamando a função e passando a string como argumento
modificarString(minhaString);
// Imprimindo a string após a chamada da função
console.log(minhaString); // Saída: 'string inicial'
Neste exemplo, a função modificarString
recebeu a string minhaString
como argumento e tentou modificar seu valor. No entanto, como strings são tipos primitivos e a passagem é por valor, a modificação feita dentro da função não afetou a variável original fora dela.
Em resumo, em JavaScript, quando você passa um objeto como argumento para uma função, está passando uma referência ao objeto, permitindo modificações diretas nos dados do objeto fora da função. Mas quando você passa um tipo primitivo, está passando uma cópia do valor, e qualquer modificação feita dentro da função não afeta a variável original fora dela.
“Mais Informações”
Claro, vamos explorar um pouco mais sobre o conceito de passagem por referência em JavaScript e como ele se relaciona com a manipulação de objetos e tipos primitivos.
Em JavaScript, os tipos de dados podem ser divididos em dois grupos principais: tipos primitivos e objetos.
Os tipos primitivos incluem:
- Números (number)
- Strings (string)
- Booleanos (boolean)
- Null (null)
- Undefined (undefined)
- Symbol (symbol) – introduzido no ECMAScript 6
Enquanto isso, os objetos em JavaScript incluem:
- Objetos (object)
- Arrays (array)
- Funções (function)
- Data (date)
- RegExp (regular expression)
- Outros tipos de objetos personalizados
A principal diferença entre tipos primitivos e objetos em JavaScript é como eles são tratados quando passados como argumentos para funções.
Quando um tipo primitivo é passado como argumento para uma função, uma cópia do valor é passada. Isso significa que qualquer modificação feita dentro da função não afetará a variável original fora dela. Por exemplo:
javascriptfunction modificarValor(numero) {
numero = 10;
}
let meuNumero = 5;
modificarValor(meuNumero);
console.log(meuNumero); // Saída: 5
No entanto, quando um objeto é passado como argumento para uma função, uma referência ao objeto é passada. Isso significa que a variável dentro da função e a variável original fora dela apontam para o mesmo objeto na memória. Portanto, as modificações feitas dentro da função afetarão o objeto original. Por exemplo:
javascriptfunction modificarPropriedade(objeto) {
objeto.propriedade = 'novo valor';
}
let meuObjeto = { propriedade: 'valor inicial' };
modificarPropriedade(meuObjeto);
console.log(meuObjeto.propriedade); // Saída: 'novo valor'
É importante notar que, embora as modificações nos objetos sejam refletidas fora da função, a reatribuição do objeto dentro da função não afetará o objeto original fora dela. Por exemplo:
javascriptfunction reatribuirObjeto(objeto) {
objeto = { novaPropriedade: 'valor' };
}
let meuObjeto = { propriedade: 'valor inicial' };
reatribuirObjeto(meuObjeto);
console.log(meuObjeto.propriedade); // Saída: 'valor inicial'
Neste caso, a função reatribuirObjeto
recebe uma referência ao objeto original, mas depois reatribui essa referência a um novo objeto. Isso não afeta o objeto original fora da função.
Em resumo, em JavaScript, a passagem por referência ocorre quando objetos são passados como argumentos para funções, permitindo modificações diretas nos dados do objeto fora da função. No entanto, a reatribuição do objeto dentro da função não afetará o objeto original fora dela. Já os tipos primitivos são passados por valor, o que significa que uma cópia do valor é passada, e as modificações dentro da função não afetam a variável original fora dela.