前端学习之——js函数参数按值传递

在JavaScript里函数参数可以任何类型,对于非引用类型的变量以值传递很好理解,在向参数传递基本类型的值时,被传递的值会被复制给命名参数,即arguments对象数组的中一个元素,如下:

var a = 1;
function add(num){ num++; return num; } var b = add(a);
console.log(c); //2
console.log(a); //1 未改变

这可以看出在把a以参数传给add函数时,先把a复制一份传给argument命名参数,根据基本类型数据的特性,复制基本类型数据后是完全两个独立的个体,只是值相同而已,互不影响。

接下来看如果参数为复杂类型数据,如object时,如下:

var obj = {
    name: "小白"  
}
function change (obj) {
  obj.name = "小黑";
  return;
}
change(obj);
console.log(obj.name); //小黑

这样乍一看好像是引用传参,但写下来在看下列代码:  

var obj = {
    name: "小白"  
}
function change (obj) {
  obj.name = "小黑"
  obj = new Object();   obj.name = "大黄";   return; }
change(obj); console.log(obj.name); //小黑

其实当参数为引用类型数据时,它也是按值传递的,只是根据对象的特性,但复制一份obj时,两个对象都指向同一个地址,因此在第二个代码示例里,change里改变了obj.name时,它指向的地址也被改变,全局变量obj的name属性自然也改变了。第三个代码示例里也证明了js函数参数是按值传递,如果是引用传参的话,第三个代码示例结果的console出来的应该是“大黄”了。  

  

posted @ 2017-03-02 22:35  xplblog  阅读(698)  评论(0编辑  收藏  举报