在向函数传递引用类型的参数时,相当于把引用类型的地址复制给函数内的一个局部变量,所以局部变量和传入的参数会指向内存中的同一个对象。 局部变量的变化也会映射到传入参数
function setAge(obj){
obj.age = 20;
}
var person = new Object();
setAge(person);
console.log(person.age); // 20
解释: 我们创建了person对象,但是我们创建的person并没有age属性,然后我们通过setAge方法给函数内的局部变量obj添加了age属性,但是函数内局部变量obj的变化会映射到传入参数,这说明两者在都指向内存中的同一个地址。
然而引用类型作为参数传递并不说明引用类型传参是按引用传参的
function setAge(person){
obj.age = 20;
obj = {
age: 30
};
}
var person = new Object();
setAge(person);
console.log(person.age); // 20
解释:我们在函数内让person重新指向一个新的对象,等于切断了函数内局部变量obj与传入参数person的联系,即局部变量指向一个新的地址。
如果是按引用类型传递的话,那么全局变量person就会与局部变量obj指向同一个地址,那么person.age也应为30,由于不是按引用传递的,所以全局变量person还是指向原来的地址
参考自: JavaScript高级程序设计第3版