先说结论: javascript 是按值传参的
//example one
var name = 'Carl';
function changeName(name){ name = 'Dazzy' };
changeName(name);
console.log(name);// 'Carl';
// example two
var obj = {name: 'Lucy'};
function changeObjName(obj){
obj.name = 'dazzy';
};
changeObjName(obj);
console.log(obj.name);// 'dazzy';
第一个例子的name的值没有发生变化,这验证了JavaScript是按值传参的说法,但是第二个例子的obj的name属性则发生了变化,貌似是按引用传值的才是对的。但并非如此。这里需要解释下函数在调用时传入的实参都会变成函数内部的局部变量,比如函数有个形参obj,在函数调用时传入实参a, a={name:'carl'},在函数内部相当于发生了 var obj = a;a在外部是一个指向{name: 'carl'}的指针,它有自己的内存空间,obj 被赋值了 a这个指针,其实就是a指针的一个副本,也就是另外一个指针,指向{name: 'carl'} ,所以操作obj就会影响{name:'carl'},但是给obj 重新赋值后,继续操作obj 则不会影响外部那个 {name: 'carl'},所以说JavaScript 函数参数是按值传参的,传参的时候如果传入一个指针,就会生成一个指针副本,就像同一把钥匙被复制了另一把出来。两者本质上使用的是不同的内存空间。传入的如果直接是一个引用各类型,就会生成一个引用类型的指针,也是开辟了一个新的内存空间。因此函数是按值传参的。这样就很好理解javascript是按值传参的概念了。
网上还有一个反证法来证明这个概念:
function setName(person){
person.name = 'carl';
person = new Object();
person.name = 'dazzy';
}
function Person();
var person1 = new Person();
person1.name = 'carl';
setName(person1);
console.log(person1.name);// carl
如果是引用传参的话person1.name的值就应该是dazzy了