先明确一下结论:函数的参数传递,传递的都是值,参数是 Object 类型的也一样,也是值,只不过这个值是地址值。( C 语言中, 函数参数的传递情况也是这样!很多教材都讲解的有问题的!)
下面是作者的原话:
variables are accessed both by value and by reference, but arguments are passed only by value.
啰嗦了这么多就是想让你知道,JS 中函数传递只有按值传递,没有按引用传递,C 语言里也一样!
下面来讲解一下:
function setName(obj) {
// 这里 obj 和 person 指向内存中的同一块地址,a 地址
obj.name = "Nicholas";
// 这里 obj 指向了新对象所在的地址( b 地址),切断了和 a 地址的联系
obj = new Object();
obj.name = "Greg";
}
var person = new Object();
setName(person);
alert(person.name); //output: "Nicholas"
我们把 person 的地址值传递给 obj 之后,obj 和 person 都指向了堆内存中的 同一块地址( a 地址 ),所以这里对 obj 进行添加或删除属性的操作,都是在 a 地址上操作的,所以相应的变化会反映在 person 对象上。
那么,当对 obj 重新赋值, 这时候就切断了 obj 和 a 地址之间的联系,所以对 obj 上的任何操作也不会反映到 person 对象上。如果函数的参数是按引用传递的话, person 也会指向地址 b , 然而事实上 person 指向的是地址 a 。
现在,抛弃你脑海中参数传递还有按引用传递的情况, 只有按值传递!