ECMAScript 中的所有参数传递的都是值,不可能通过引用传递参数。
不少人对参数都是按值传递的感到困惑,因为访问变量有按值和按引用两种方式。
按值传递
function add(num) {
num += 1;
return num;
}
var count = 20;
var result = add(count); //按值传递 num = count
alert(count); // 20, 没变化
alert(result); // 21
按值传递传递完后两个变量互不相干
按引用传递
function sayName(obj) {
obj.name = 'Jack';
}
var person = new Object();
sayName(person);
console.log(person.name); // Jack
当 var person = new Object() 时,可以用下图表示变量和对象的关系

当调用函数 setName(person)时,下图可以表示全局变量person和局部变量obj的关心:

在上述例子中 sayName 函数的参数虽然感觉是引用传递,但事实上,该函数参数还是按值传递,传递的是 obj 的内存地址。
在将上述例子修改
function sayName(obj) {
obj.name = "Jack";
obj = new Object(); //改变obj的指向,此时obj指向一个新的内存地址,不再和person指向同一
obj.name = "Greg";
}
var person = new Object();
sayName(person);
console.log(person.name); //"Jack"
当创建obj对象 obj = new Object(); 时,来看看这时person和obj的关系图:

综上所述:对象引用本身就是传递引用地址,重新初始化变量会改变引用地址,也不会更改原变量。