Resumo : Este tutorial explica como funciona a passagem por valor do JavaScript e fornece alguns exemplos de passagem de valores primitivos e de referência para uma função.
Antes de prosseguir com este tutorial, você deve ter um bom conhecimento dos valores primitivos e de referência e das diferenças entre eles .
JavaScript passagem por valor ou passagem por referência
Em JavaScript, todos os argumentos de função são sempre passados por valor. Isso significa que o JavaScript copia os valores das variáveis nos argumentos da função.
Quaisquer alterações feitas nos argumentos dentro da função não refletem as variáveis passadas fora da função. Em outras palavras, as alterações feitas nos argumentos não são refletidas fora da função.
Se os argumentos da função forem passados por referência, as alterações nas variáveis que você passa para a função serão refletidas fora da função. Isso não é possível em JavaScript.
Passagem por valor de valores primitivos
Vamos dar uma olhada no exemplo a seguir.
function square(x) {
x = x * x;
return x;
}
let y = 10;
let result = square(y);
console.log(result); // 100
console.log(y); // 10 -- no change
Linguagem de código: JavaScript ( javascript )
Como funciona o roteiro.
Primeiro, defina uma square()
função que aceite um argumento x
. A função atribui o quadrado de x
ao x
argumento.
A seguir, declare a variável y
e inicialize seu valor para 10
:
Em seguida, passe a y
variável para a square()
função. Ao passar a variável y
para a square()
função, o JavaScript copia y
o valor para a x
variável.
Depois disso, a square()
função altera a x
variável. No entanto, isso não afeta o valor da y
variável porque x
e y
são variáveis separadas.
Finalmente, o valor da y
variável não muda após a square()
conclusão da função.
Se o JavaScript usasse a passagem por referência, a variável y
mudaria para 100
após chamar a função.
Passagem por valor de valores de referência
Não é óbvio ver que os valores de referência também são passados por valores. Por exemplo:
let person = {
name: 'John',
age: 25,
};
function increaseAge(obj) {
obj.age += 1;
}
increaseAge(person);
console.log(person);
Linguagem de código: JavaScript ( javascript )
Como funciona o roteiro:
Primeiro, defina a person
variável que faz referência a um objeto com duas propriedades name
e age
:
A seguir, defina a increaseAge()
função que aceita um objeto obj
e aumenta a age
propriedade do obj
argumento em um.
Em seguida, passe o person
objeto para a increaseAge()
função:
Internamente, o mecanismo JavaScript cria a obj
referência e faz com que essa variável faça referência ao mesmo objeto ao qual a person
variável faz referência.
Depois disso, aumente a age
propriedade em um dentro da increaseAge()
função através da obj
variável
Por fim, acessando o objeto através da person
referência:
Parece que o JavaScript passa um objeto por referência porque a alteração no objeto é refletida fora da função. No entanto, este não é o caso.
Na verdade, ao passar um objeto para uma função, você está passando a referência desse objeto, não o objeto real. Portanto, a função pode modificar as propriedades do objeto através da sua referência.
No entanto, você não pode alterar a referência passada para a função. Por exemplo:
let person = {
name: 'John',
age: 25,
};
function increaseAge(obj) {
obj.age += 1;
// reference another object
obj = { name: 'Jane', age: 22 };
}
increaseAge(person);
console.log(person);
Linguagem de código: JavaScript ( javascript )
Saída:
{ name: 'John', age: 26 }
Linguagem de código: CSS ( css )
Neste exemplo, a increaseAage()
função altera a age
propriedade através do obj
argumento:
e torna a obj
referência outro objeto:
No entanto, a person
referência ainda se refere ao objeto original cuja age
propriedade muda para 26
. Em outras palavras, a increaseAge()
função não altera a person
referência.
Se este conceito ainda confunde você, você pode considerar os argumentos da função como variáveis locais.
Resumo
- JavaScript passa todos os argumentos para uma função por valores.
- Argumentos de função são variáveis locais em JavaScript.