programação

Passagem por Referência em JavaScript

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:

  1. Números (number)
  2. Strings (string)
  3. Booleanos (boolean)
  4. Null (null)
  5. Undefined (undefined)
  6. Symbol (symbol) – introduzido no ECMAScript 6

Enquanto isso, os objetos em JavaScript incluem:

  1. Objetos (object)
  2. Arrays (array)
  3. Funções (function)
  4. Data (date)
  5. RegExp (regular expression)
  6. 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:

javascript
function 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:

javascript
function 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:

javascript
function 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.

Botão Voltar ao Topo