Os tipos primitivos (número, string, etc.) são passados por valor, mas os objetos são desconhecidos, porque podem ser passados por valor (no caso de considerarmos que uma variável que contém um objeto é de fato uma referência ao objeto ) e passado por referência (quando consideramos que a variável para o objeto mantém o próprio objeto).
Embora isso realmente não importe no final, quero saber qual é a maneira correta de apresentar os argumentos que passam pelas convenções. Existe um trecho da especificação JavaScript, que define qual deve ser a semântica em relação a isso?
javascript
pass-by-reference
pass-by-value
Danail Nachev
fonte
fonte
var x=3, y=x; f(x); alert(y === x);
, a funçãof()
poderá fazer o relatório de alertafalse
e nãotrue
. No JavaScript, isso não é possível, portanto, não é passado por referência. É bom que seja possível passar referências a objetos modificáveis, mas não é isso que significa "passar por referência". Como eu disse, é uma pena que a terminologia seja tão confusa.Respostas:
É interessante em JavaScript. Considere este exemplo:
Isso produz a saída:
obj1
não fosse uma referência, a alteraçãoobj1.item
não teria efeito noobj1
exterior da função.num
seria100
, eobj2.item
iria ler"changed"
.Em vez disso, a situação é que o item passado é passado por valor. Mas o item que é passado por valor é em si uma referência. Tecnicamente, isso é chamado de chamada por compartilhamento .
Em termos práticos, isso significa que, se você alterar o próprio parâmetro (como com
num
eobj2
), isso não afetará o item que foi alimentado no parâmetro. Mas se você alterar os INTERNOS do parâmetro, isso será propagado de volta (como emobj1
).fonte
item
propriedade do objeto referenciado por obj1, está alterando o valor da propriedade do item que foi originalmente definida como "inalterada". Quando você atribui ao obj2 um valor de {item: "alterado"}, você está alterando a referência para um novo objeto (que fica imediatamente fora do escopo quando a função sai). Torna-se mais evidente o que está acontecendo se você nomear a função params, como numf, obj1f e obj2f. Então você vê que os parâmetros estavam escondendo os nomes de var externos.ref
palavra - chave.) Normalmente, você apenas faria com que a função retornasse o novo objeto e a atribuição no ponto em que você chama a função. Por exemplo, emfoo = GetNewFoo();
vez deGetNewFoo(foo);
var obj1 = { item: 'unchanged' }; var obj2 = obj1; obj2.item = 'changed';
e observar o mesmo efeito que no seu exemplo. Portanto, eu pessoalmente refiro a resposta de Tim GoodmanÉ sempre transmitido por valor, mas para objetos o valor da variável é uma referência. Por esse motivo, quando você passa um objeto e altera seus membros , essas alterações persistem fora da função. Isso faz com que pareça passar por referência. Mas se você realmente alterar o valor da variável de objeto, verá que a alteração não persiste, provando que é realmente transmitida por valor.
Exemplo:
Resultado:
fonte
changeObject
, mudeix
para conter uma referência ao novo objeto.x = {member:"bar"};
é equivalente aox = new Object(); x.member = "bar";
que estou dizendo também é verdade em C #, a propósito.ref
palavra-chave que você pode passar a referência por referência (em vez do padrão de passar a referência por valor), e então a mudança para apontar para umnew Object()
vai persistir .A variável não "mantém" o objeto; contém uma referência. Você pode atribuir essa referência a outra variável e agora ambas fazem referência ao mesmo objeto. É sempre passar por valor (mesmo quando esse valor é uma referência ...).
Não há como alterar o valor mantido por uma variável passada como parâmetro, o que seria possível se o JavaScript suportasse a passagem por referência.
fonte
Meus dois centavos ... É assim que eu entendo. (Sinta-se livre para me corrigir se eu estiver errado)
É hora de jogar fora tudo o que você sabe sobre passar por valor / referência.
Porque em JavaScript, não importa se é passado por valor ou por referência ou o que for. O que importa é a mutação vs a atribuição dos parâmetros passados para uma função.
OK, deixe-me fazer o meu melhor para explicar o que quero dizer. Digamos que você tenha alguns objetos.
O que fizemos foi "atribuição" ... Atribuímos 2 objetos vazios separados às variáveis "objeto1" e "objeto2".
Agora, digamos que gostamos mais do objeto1 ... Então, "atribuímos" uma nova variável.
Em seguida, por qualquer motivo, decidimos que gostamos mais do objeto 2. Então, simplesmente fazemos uma pequena re-atribuição.
Nada aconteceu ao objeto1 ou ao objeto2. Não alteramos nenhum dado. Tudo o que fizemos foi redesignar qual é o nosso objeto favorito. É importante saber que object2 e favoriteObject estão atribuídos ao mesmo objeto. Podemos mudar esse objeto através de qualquer uma dessas variáveis.
OK, agora vamos ver primitivas como cadeias de caracteres, por exemplo
Mais uma vez, escolhemos um favorito.
Nossas variáveis favoriteString e string1 são atribuídas a 'Hello world'. Agora, e se quisermos mudar nossa string favorita ??? O que vai acontecer???
Uh oh .... O que aconteceu. Não foi possível alterar a string1 alterando favoriteString ... Por que ?? Porque não mudamos nosso objeto string . Tudo o que fizemos foi "RE ASSIGN" a variável favoriteString para uma nova string. Isso basicamente o desconectou da string1. No exemplo anterior, quando renomeamos nosso objeto, não atribuímos nada. (Bem, não para a variável em si , ... no entanto, atribuímos a propriedade name a uma nova string.) Em vez disso, simplesmente modificamos o objeto que mantém as conexões entre as 2 variáveis e os objetos subjacentes. (Mesmo se quiséssemos modificar ou alterar o próprio objeto string, não poderíamos ter, porque as strings são realmente imutáveis em JavaScript.)
Agora, para funções e passagem de parâmetros .... Quando você chama uma função e passa um parâmetro, o que você está fazendo essencialmente é uma "atribuição" a uma nova variável, e funciona exatamente da mesma forma como se você tivesse simplesmente atribuído usando o sinal de igual (=).
Veja estes exemplos.
Agora, a mesma coisa, mas com uma função
OK, agora vamos dar alguns exemplos usando objetos ... primeiro, sem a função
Agora, a mesma coisa, mas com uma chamada de função
OK, se você ler esta postagem inteira, talvez agora tenha uma melhor compreensão de como as chamadas de função funcionam em JavaScript. Não importa se algo é passado por referência ou por valor ... O que importa é atribuição versus mutação.
Toda vez que você passa uma variável para uma função, você está "Atribuindo" a qualquer que seja o nome da variável de parâmetro, como se você usasse o sinal de igual (=).
Lembre-se sempre de que o sinal de igual (=) significa atribuição. Lembre-se sempre de que passar um parâmetro para uma função em JavaScript também significa atribuição. Eles são iguais e as 2 variáveis são conectadas exatamente da mesma maneira (ou seja, não são, a menos que você conte que elas foram atribuídas ao mesmo objeto).
O único momento em que "modificar uma variável" afeta uma variável diferente é quando o objeto subjacente é alterado (nesse caso, você não modificou a variável, mas o próprio objeto.
Não faz sentido fazer uma distinção entre objetos e primitivas, porque funciona da mesma maneira exata como se você não tivesse uma função e apenas usasse o sinal de igual para atribuir a uma nova variável.
A única pegadinha é quando o nome da variável que você passa para a função é igual ao nome do parâmetro da função. Quando isso acontece, você deve tratar o parâmetro dentro da função como se fosse uma variável totalmente nova privada à função (porque é)
fonte
foo(char *a){a="hello";}
não faz nada, mas se você o fizer,foo(char *a){a[0]='h';a[1]='i';a[2]=0;}
ele será alterado fora porquea
é um local de memória transmitido por valor que faz referência a uma string (matriz de caracteres). Passar estruturas (semelhantes aos objetos js) pelo valor em C é permitido, mas não recomendado. O JavaScript simplesmente impõe essas práticas recomendadas e oculta a quantidade desnecessária e geralmente indesejada ... e com certeza facilita a leitura.source = { "id":"1"}; copy = source /*this is wrong*/; copy.id="2"
essa fonte ainda seja {"id": "1"}?Considere o seguinte:
Portanto,
esqueça "passar por referência / valor", não fique desligado em "passar por referência / valor" porque:Para responder sua pergunta: os ponteiros são passados.
Alguns comentários finais:
fonte
{'George', 1}
valores, mas usar apenas uma por vez, como as outras serão gerenciadas? E o que acontece quando atribuo uma variável ao valor de outra variável? Estou então apontando para um ponteiro ou apontando para o pontapé do operando certo? Ovar myExistingVar = {"blah", 42}; var obj = myExistingVar;
resultado éobj
apontar para{"blah", 42}
ou paramyExistingVar
?1)
executei um perfil de memória nas ferramentas de desenvolvimento do navegador para uma função de loop, como a que você descreveu e viu picos no uso de memória durante todo o processo de loop. Isso parece indicar que novos objetos idênticos estão realmente sendo criados em cada iteração do loop. Quando os picos caem repentinamente, o coletor de lixo acaba de limpar um grupo desses objetos não utilizados.2)
Em relação a algo comovar a = b
, o javascript não fornece um mecanismo para o uso de ponteiros e, portanto, uma variável nunca pode apontar para um ponteiro (como você pode em C), embora o mecanismo javascript subjacente, sem dúvida, os utilize. Então ...var a = b
apontaráa
"para o pontapé do operando certo"Um objeto fora de uma função é passado para uma função, fornecendo uma referência ao objeto externo.
Quando você usa essa referência para manipular seu objeto, o objeto externo é afetado. No entanto, se dentro da função você decidiu apontar a referência para outra coisa, você não afetou o objeto de fora, porque tudo o que você fez foi redirecionar a referência para outra coisa.
fonte
Pense assim: sempre passa por valor. No entanto, o valor de um objeto não é o objeto em si, mas uma referência a esse objeto.
Aqui está um exemplo, passando um número (um tipo primitivo)
Repetir isso com um objeto gera resultados diferentes:
Mais um exemplo:
fonte
Uma explicação muito detalhada sobre como copiar, transmitir e comparar por valor e por referência está neste capítulo do livro "JavaScript: The Definitive Guide" .
fonte
O JavaScript é sempre transmitido por valor ; tudo é do tipo valor.
Objetos são valores e funções-membro de objetos são valores próprios (lembre-se de que funções são objetos de primeira classe em JavaScript). Além disso, com relação ao conceito de que tudo em JavaScript é um objeto ; isto está errado. Sequências, símbolos, números, booleanos, nulos e indefinidos são primitivos .
Ocasionalmente, eles podem aproveitar algumas funções-membro e propriedades herdadas de seus protótipos de base, mas isso é apenas por conveniência. Isso não significa que eles próprios sejam objetos. Tente o seguinte para referência:
Nos dois alertas, você encontrará o valor indefinido.
fonte
x = "teste"; x.foo = 12;
etc. Só porque uma propriedade não é persistente, não significa que não seja um objeto. Como a MDN diz: No JavaScript, quase tudo é um objeto. Todos os tipos primitivos, exceto nulo e indefinido, são tratados como objetos. Eles podem ter propriedades atribuídas (propriedades atribuídas de alguns tipos não são persistentes) e possuem todas as características dos objetos. linkEm JavaScript, o tipo do valor controla apenas se esse valor será atribuído por cópia de valor ou cópia de referência .
Os valores primitivos são sempre atribuídos / transmitidos por cópia de valor :
null
undefined
ES6
Os valores compostos são sempre atribuídos / transmitidos por cópia de referência
Por exemplo
No trecho acima, por
2
ser uma primitiva escalar,a
mantém uma cópia inicial desse valor eb
recebe outra cópia do valor. Ao alterarb
, você não altera o valor ema
.Mas ambos
c
ed
são referências separadas para o mesmo valor compartilhado[1,2,3]
, que é um valor composto. É importante observar quec
nemd
mais "possui" o[1,2,3]
valor - ambos são apenas referências iguais ao valor. Portanto, ao usar qualquer referência para modificar (.push(4)
) o próprioarray
valor compartilhado real , ele afeta apenas um valor compartilhado, e as duas referências fazem referência ao valor recém-modificado[1,2,3,4]
.Quando fazemos a tarefa
b = [4,5,6]
, não estamos fazendo absolutamente nada para afetar ondea
ainda está fazendo referência ([1,2,3]
). Para fazer isso,b
teria que ser um ponteiro para, ema
vez de uma referência aoarray
- mas esse recurso não existe no JS!Quando passamos o argumento
a
, ele atribui uma cópia daa
referência ax
.x
ea
são referências separadas apontando para o mesmo[1,2,3]
valor. Agora, dentro da função, podemos usar essa referência para alterar o próprio valor (push(4)
). Porém, quando fazemos a atribuiçãox = [4,5,6]
, isso não afeta de maneira alguma para onde a referência iniciala
está apontando - ainda aponta para o valor (agora modificado)[1,2,3,4]
.Para passar efetivamente um valor composto (como um
array
) por cópia de valor, é necessário fazer uma cópia manualmente, para que a referência passada ainda não aponte para o original. Por exemplo:Valor composto (objeto, matriz, etc.) que pode ser passado por cópia de referência
Aqui,
obj
atua como um invólucro para a propriedade primitiva escalara
. Quando passado parafoo(..)
, uma cópia doobj
referência é passada e definida como owrapper
parâmetro Agora podemos usar awrapper
referência para acessar o objeto compartilhado e atualizar sua propriedade. Depois que a função terminar,obj.a
você verá o valor atualizado42
.Fonte
fonte
bem, trata-se de 'desempenho' e 'velocidade' e na palavra simples 'gerenciamento de memória' em uma linguagem de programação.
em javascript, podemos colocar valores em duas camadas: type1 -
objects
e type2 - todos os outros tipos de valor, comostring
&boolean
& etcse você imaginar a memória como quadrados abaixo, os quais em cada um deles apenas um valor type2 pode ser salvo:
todo valor type2 (verde) é um único quadrado, enquanto um valor type1 (azul) é um grupo deles :
o ponto é que, se você deseja indicar um valor type2, o endereço é simples, mas se você deseja fazer a mesma coisa com o valor type1, isso não é nada fácil! :
e em uma história mais complicada:
então aqui as referências podem nos resgatar:
enquanto a seta verde aqui é uma variável típica, a roxa é uma variável de objeto, portanto, porque a seta verde (variável típica) tem apenas uma tarefa (e isso indica um valor típico), não precisamos separar seu valor de então movemos a seta verde com o valor disso para onde for e em todas as atribuições, funções e assim por diante ...
mas não podemos fazer o mesmo com a seta roxa, podemos mover a célula 'john' para cá ou muitas outras coisas ..., para que a seta roxa se mantenha no seu lugar e apenas as flechas típicas atribuídas ...
uma situação muito confusa é onde você não pode perceber como a variável referenciada muda, vamos dar uma olhada em um exemplo muito bom:
fonte
Isso é um pouco mais de explicação para passagem por valor e passagem por referência (JavaScript). Nesse conceito, eles estão falando sobre passar a variável por referência e passar a variável por referência.
Passar por valor (tipo primitivo)
Passar por referência (objetos)
c
e aponta para alguma memória, digamos (0x012).d
aponte para o mesmo local (0x012).Caso especial, passar por referência (objetos)
fonte
c
está configurada para uma cópia da referência do novo objeto.Em JavaScript, ao atribuir um objeto a uma variável, o valor atribuído à variável é uma referência ao objeto:
fonte
Semântica!! Definir definições concretas necessariamente tornará algumas respostas e comentários incompatíveis, pois eles não estão descrevendo a mesma coisa, mesmo ao usar as mesmas palavras e frases, mas é fundamental superar a confusão (especialmente para novos programadores).
Primeiro de tudo, existem vários níveis de abstração que nem todos parecem entender. Programadores mais novos que aprenderam em linguagens de quarta ou quinta geração podem ter dificuldade em compreender conceitos familiares para assembly ou programadores em C que não são colocados em fases por ponteiros para ponteiros para ponteiros. Passagem por referência não significa simplesmente a capacidade de alterar um objeto referenciado usando uma variável de parâmetro de função.
Variável : conceito combinado de um símbolo que faz referência a um valor em um local específico na memória. Esse termo geralmente é carregado demais para ser usado sozinho na discussão de detalhes.
Símbolo : sequência de texto usada para se referir à variável (ou seja, nome da variável).
Valor : bits específicos armazenados na memória e referenciados usando o símbolo da variável.
Localização da memória : onde o valor de uma variável é armazenado. (O local em si é representado por um número separado do valor armazenado no local.)
Parâmetro da função : variável declarada em uma definição de função, usada para referenciar variáveis passadas para a função.
Argumento da função : variável fora da função que é passada para a função pelo chamador.
Variável de objeto : variável cujo valor subjacente básico não é o "objeto" em si, mas seu valor é um ponteiro (valor do local da memória) para outro local na memória onde os dados reais do objeto são armazenados. Na maioria das linguagens de alta geração, o aspecto "ponteiro" é efetivamente oculto pela des-referência automática em vários contextos.
Variável primitiva : variável cujo valor é o valor real. Mesmo esse conceito pode ser complicado pelo auto-boxe e contextos semelhantes a objetos de várias linguagens, mas as idéias gerais são que o valor da variável É o valor real representado pelo símbolo da variável em vez de um ponteiro para outro local da memória.
Argumentos e parâmetros de função não são a mesma coisa. Além disso, o valor de uma variável não é o objeto da variável (como já apontado por várias pessoas, mas aparentemente ignorado). Essas distinções são críticas para o entendimento adequado.
Passagem por valor ou Chamada por compartilhamento (para objetos): O valor do argumento da função é COPIADO para outro local da memória que é referenciado pelo símbolo de parâmetro da função (independentemente de estar na pilha ou na pilha). Em outras palavras, o parâmetro function recebeu uma cópia do valor do argumento passado ... E (crítico) o valor do argumento NUNCA É ATUALIZADO / ALTERADO / ALTERADO pela função de chamada. Lembre-se de que o valor de uma variável de objeto NÃO é o objeto em si, é o ponteiro para o objeto, portanto, passar uma variável de objeto por valor copia o ponteiro para a variável de parâmetro de função. O valor do parâmetro da função aponta exatamente para o mesmo objeto na memória. Os dados do objeto em si podem ser alterados diretamente através do parâmetro function, MAS o valor do argumento da função NUNCA É ATUALIZADO, portanto, ele continuará apontando para o parâmetro mesmoobjeto durante e mesmo após a chamada da função (mesmo que os dados do objeto tenham sido alterados ou se o parâmetro da função tiver um objeto diferente totalmente atribuído). É incorreto concluir que o argumento da função foi passado por referência apenas porque o objeto referenciado é atualizável por meio da variável de parâmetro da função.
Chamada / Passagem por referência : o valor do argumento da função pode / será atualizado diretamente pelo parâmetro de função correspondente. Se ajudar, o parâmetro de função se torna um "alias" eficaz para o argumento - eles se referem efetivamente ao mesmo valor no mesmo local de memória. Se um argumento de função for uma variável de objeto, a capacidade de alterar os dados do objeto não será diferente do caso de passagem por valor, pois o parâmetro de função ainda apontará para o mesmo objeto que o argumento. Mas, no caso da variável de objeto, se o parâmetro de função estiver definido para um objeto completamente diferente, o argumento também apontará para o objeto diferente - isso não acontece no caso de passagem por valor.
JavaScript não passa por referência. Se você ler atentamente, perceberá que todas as opiniões contrárias interpretam mal o que se entende por passagem por valor e concluem falsamente que a capacidade de atualizar os dados de um objeto por meio do parâmetro function é sinônimo de "passagem por valor".
Clone / cópia de objeto: Um novo objeto é criado e os dados do objeto original são copiados. Pode ser uma cópia profunda ou superficial, mas o ponto é que um novo objeto é criado. Criar uma cópia de um objeto é um conceito separado da passagem por valor. Algumas linguagens distinguem entre objeto de classe e estruturas (ou similares) e podem ter um comportamento diferente para passar variáveis dos diferentes tipos. Mas o JavaScript não faz nada assim automaticamente ao passar variáveis de objeto. Mas a ausência de clonagem automática de objetos não se traduz em passagem por referência.
fonte
JavaScript passa tipos primitivos por valor e tipos de objeto por referência
- Brian Bi - Quais linguagens de programação são passadas por referência?
Atualizar
Aqui está uma refutação a isso:
Não há "passagem por referência" disponível em JavaScript.
fonte
Minha maneira simples de entender isso ...
Ao chamar uma função, você está transmitindo o conteúdo (referência ou valor) das variáveis de argumento, não as próprias variáveis.
Dentro da função, as variáveis de parâmetro
inVar1
einVar2
recebem o conteúdo que está sendo passado.Desde que
inVar2
recebeu a referência de{ prop: 2 }
, você pode alterar o valor da propriedade do objeto.fonte
Passar argumentos para uma função em JavaScript é análogo a passar parâmetros pelo valor do ponteiro em C:
fonte
Para os advogados de linguagem de programação, eu examinei as seções a seguir do ECMAScript 5.1 (que é mais fácil de ler do que a edição mais recente), e cheguei ao ponto de perguntar na lista de correspondência do ECMAScript.
TL; DR : Tudo é passado por valor, mas as propriedades de Objetos são referências e a definição de Objeto é assustadoramente ausente no padrão.
Construção de listas de argumentos
A Seção 11.2.4 "Listas de argumentos" diz o seguinte sobre a produção de uma lista de argumentos que consiste em apenas 1 argumento:
A seção também enumera casos em que a lista de argumentos possui 0 ou> 1 argumentos.
Assim, tudo é passado por referência.
Acesso às propriedades do objeto
Seção 11.2.1 "Acessadores de propriedades"
Assim, as propriedades dos objetos estão sempre disponíveis como referência.
Na Referência
É descrito na seção 8.7 "O Tipo de especificação de referência", que as referências não são tipos reais no idioma - elas são usadas apenas para descrever o comportamento dos operadores de exclusão, tipo e tipos de atribuição.
Definição de "Objeto"
É definido na edição 5.1 que "Um Objeto é uma coleção de propriedades". Portanto, podemos inferir que o valor do objeto é a coleção, mas qual é o valor da coleção é mal definido na especificação e requer um pouco de esforço para entender.
fonte
Os documentos MDN explicam isso claramente, sem ser muito detalhado:
Fonte: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions#Description
fonte
Em um idioma de baixo nível, se você deseja passar uma variável por referência, é necessário usar uma sintaxe específica na criação da função:
O
&age
é uma referência amyAge
, mas se você deseja o valor, precisa converter a referência, usando*age
.Javascript é uma linguagem de alto nível que faz essa conversão para você. Portanto, embora os objetos sejam passados por referência, o idioma converte o parâmetro de referência no valor. Você não precisa usar
&
, na definição da função, para passá-la por referência, nem*
no corpo da função, para converter a referência no valor, JS faz isso por você.É por isso que quando você tenta alterar um objeto dentro de uma função, substituindo seu valor (ou seja
age = {value:5}
), a alteração não persiste, mas se você alterar suas propriedades (ou seja,age.value = 5
), ela .Saber mais
fonte
Eu li essas respostas várias vezes, mas REALMENTE não as recebi até aprender sobre a definição técnica de "Chamada por compartilhamento", conforme denominado por Barbara Liskov
Ou seja, as referências dos parâmetros são alteráveis se você acessar o próprio valor do parâmetro. Por outro lado, a atribuição a um parâmetro desaparecerá após a avaliação e não poderá ser acessada pelo chamador da função.
fonte
Maneira mais simples
fonte
JSON.parse( JSON.stringify( obj ) )
é uma maneira horrível de clonar objetos profundamente. Não apenas não é apenas lento, mas também pode causar perda de dados.Eu achei o método de extensão da biblioteca Underscore.js muito útil quando quero passar um objeto como um parâmetro que pode ser modificado ou substituído inteiramente.
fonte
A explicação mais sucinta que encontrei foi no guia de estilo do AirBNB :
Primitivas : ao acessar um tipo primitivo, você trabalha diretamente em seu valor
Por exemplo:
Complexo : ao acessar um tipo complexo, você trabalha em uma referência ao seu valor
Por exemplo:
Ou seja, tipos primitivos efetivamente são passados por valor e tipos complexos são passados por referência.
fonte
Eu diria que é passagem por cópia -
Considere que argumentos e objetos variáveis são objetos criados durante o contexto de execução criado no início da chamada da função - e seu valor / referência real passado para a função é armazenado nesses argumentos + objetos variáveis.
Simplificando, para tipos primitivos, os valores são copiados no início da chamada de função, para tipo de objeto, a referência é copiada.
fonte
Há alguma discussão sobre o uso do termo "passagem por referência" em JavaScript aqui , mas para responder sua pergunta:
(Do artigo mencionado acima.)
fonte
Uma maneira fácil de determinar se algo é "passado por referência" é se você pode escrever uma função "swap". Por exemplo, em C, você pode fazer:
Se você não pode fazer o equivalente ao JavaScript, não é "passar por referência".
fonte
Matriz e Objeto são passados como passagem por referência ou passagem por valor com base nessas duas condições.
se você estiver alterando o valor desse objeto ou matriz com o novo objeto ou matriz, ele será passado por valor.
object1 = {item: "car"}; array1=[1,2,3];
aqui você está atribuindo um novo objeto ou matriz ao antigo. você não está alterando o valor da propriedade do objeto antigo. portanto, é transmitido por valor.
se você estiver alterando um valor de propriedade de um objeto ou matriz, ele será passado por Referência.
object1.key1= "car"; array1[0]=9;
aqui você está alterando um valor de propriedade do objeto antigo. você não está atribuindo um novo objeto ou matriz ao antigo. então é passado por referência.
Código
fonte
fonte
Valores simples dentro de funções não alteram esses valores fora da função (eles são passados por valor), enquanto valores complexos mudam (eles são passados por referência).
fonte