关于JS传递参数是按值传递的理解

2017-07-30  本文已影响0人  xiaoguo16

今天看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传递参数其实可以看作是先进行变量的复制,再进行操作。而复制时,由于基本类型和引用类型的不同,所以复制的东西不同,对于基本类型,复制的是值,对于引用类型,复制的是地址。

上一篇 下一篇

猜你喜欢

热点阅读