Javascript по ссылке или по значению [дубликат]

На этот вопрос уже есть ответ здесь:

] Я ищу хороший исчерпывающий материал для чтения о том, когда Javascript передает что-то по значению, а когда по ссылке и когда изменение переданного элемента влияет на значение вне функции, а когда нет. Меня также интересует, когда присвоение другой переменной осуществляется по ссылке или по значению, и следует ли это каким-либо другим правилам, кроме передачи в качестве параметра функции.

Я провел много поисков и нашел множество конкретных примеров ( многие из них здесь, на SO), из которых я могу начать собирать воедино настоящие правила, но я еще не нашел ни одного хорошо написанного документа, который бы все это описывал.

Кроме того, есть способы в языке чтобы контролировать, передается ли что-либо по ссылке или по значению?

Вот некоторые из типов вопросов, которые я хочу понять. Это всего лишь примеры - я действительно хочу понять правила, по которым работает язык, а не только ответы на конкретные примеры. Но вот несколько примеров:

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);

Когда содержимое x, y и z изменяется вне области действия f для всех различных типов?

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

Если я хочу сделать полностью независимую копию объекта (без ссылок как бы то ни было), как лучше всего это сделать?

366
задан jfriend00 6 July 2011 в 17:17
поделиться