Javascript por referência x por valor [duplicado]
Esta pergunta já tem uma resposta aqui:
O JavaScript é uma linguagem de passagem por referência ou de passagem por valor? 29 respostasEstou procurando um bom material de leitura abrangente sobre quando o Javascript passa algo por valor e quando por referência e quando a modificação de um item passado afeta o valor fora de uma função e quando não. Também estou interessado em atribuir a outra variável por referência x por valor e se isso segue regras diferentes do que passar como parâmetro de funçã
Pesquisei bastante e encontrei muitos exemplos específicos (muitos deles aqui no SO) a partir dos quais posso começar a reunir partes das regras reais, mas ainda não encontrei um único documento bem escrito que descreve tudo.
lém disso, existem maneiras na linguagem de controlar se algo é passado por referência ou por valo
Aqui estão alguns dos tipos de perguntas que eu quero entender. Estes são apenas exemplos - na verdade, estou procurando entender as regras que a linguagem segue, não apenas as respostas para exemplos específicos. Mas, aqui estão alguns exemplos:
function f(a,b,c) {
a = 3;
b.push("foo");
c.first = false;
}
var x = 4;
var y = ["eeny", "miny", "mo"];
var z = {first: true};
f(x,y,z);
Quando o conteúdo de x, ye z foram alterados fora do escopo de f para todos os diferentes tipo
function f() {
var a = ["1", "2", "3"];
var b = a[1];
a[1] = "4";
// what is the value of b now for all possible data types that the array in "a" might hold?
}
function f() {
var a = [{yellow: "blue"}, {red: "cyan"}, {green: "magenta"}];
var b = a[1];
a[1].red = "tan";
// what is the value of b now and why?
b.red = "black";
// did the value of a[1].red change when I assigned to b.red?
}
Se eu quiser fazer uma cópia totalmente independente de um objeto (sem referências), qual é a melhor maneira de fazer isso?