今天看JS高程第四章时,里面讲到函数参数是按值传递的,当时有点不能理解,但是想了一会,豁然开朗。
其实只要理解了什么是按值传递,什么是按引用传递即可理解。
按值传递:传递的是副本,所以修改形参不会影响实参。
按引用传递:传递的是实参本身,而非副本。
而JS在传递参数时,会有一个临时变量来存放该参数,这个临时变量存放的是参数的副本。
- 对于基本类型值来说,这个临时变量存放的就是这个基本类型值的副本。对这个参数的操作不会影响实参。如:
var num=2;
function add(a){
a=a+2;
return a;
}
console.log(add(num))//4
console.log(num)//2
由于形参a存放的是num的副本,也就是形参a会将num的值复制过来,然后进行操作。所以num的值不受其影响。
- 对于引用类型值来说,这个临时变量存放的是地址的副本。如:
var obj={name:"gly"};
function changeName(a){
a.name="lq";
return a.name;
}
console.log(changeName(obj))//"lq"
console.log(obj.name)//"lq"
因为参数a和obj是同一个地址,所以他们指向的都是同一个对象,因此对对象的修改也就反应到了obj中。
再来一个例子:
var obj={name:"gly"};
function changeName(a){
a.name="lq";
a=new Object();
a.name="aaa"
return a.name;
}
console.log(changeName(obj))//"aaa"
console.log(obj.name)//"lq"
这个例子中由于对参数a赋值了一个新的对象,这样它的地址也就改变了,所以对它的属性的修改不会影响obj,因为他俩地址不同,指向的不是一个对象。
所以说,不管传入的参数是基本类型还是引用类型,它们都是副本,只是一个是值的副本,一个是地址的副本。
综上,JS传递参数其实可以看作是先进行变量的复制,再进行操作。而复制时,由于基本类型和引用类型的不同,所以复制的东西不同,对于基本类型,复制的是值,对于引用类型,复制的是地址。