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 respostas

Estou 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?

questionAnswers(4)

yourAnswerToTheQuestion