我正在寻找一些全面的读物,关于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?
}
如果我想创建一个完全独立的对象副本(没有任何引用),那么最佳实践的方式是什么?