Js基础之基本数据类型和引用类型的参数传递详细分析

原来一直都没注意,,这么基础的问题。。原来JS对象传参一直都是引用传参。。。

那时候还一直怪JS连个引用传参都没。。现在发现了,,可以利用起来哈!

Js中所有函数的参数传递都是按值传递的,也就是把函数外面的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。下面举几个特别的例子

1、基本数据类型传递参数:


代码如下:


  funciton addTen(num){

    num+=10;

    return num;

  }

  var count=20;

  var result=addTen(count);

  alert(count);//20

  alert(resullt);//30


   执行结果是:20和30。在这段代码中,将变量count当做参数传递给了函数addTen,也就是相当于将变量count的值复制给了函数 addTen的参数。这时addTen的参数num可以看做是函数内部的一个变量。在上段代码中,就相当于两个基本数据类型变量之间的值复制。而基本数据 类型都有自己独立的内存地址,所以num和count是没有任何关系的,他们只是值相等而已,函数执行完毕后,count的值并没有改变。而函数外面的 result是被直接赋值的,所以result的值就是函数的结果30。

  2、引用类型传递参数:


代码如下:


  function setName(obj){

    obj.name="LSN";

  }

  var person=new Object();

  setName(person);

  alert(person.name);//LSN


   执行结果是:LSN。在这段代码中,函数setName的作用是给obj对象添加了一个属性name并给该属性赋值为"LSN",因为obj是引用类 型,所以这里属于是将引用类型person赋值给了obj,也就是说person和obj引用了一个内存地址,所以当给obj新加了属性name时,在函 数外面的person也跟着改变,最后person.naem的结果为LSN。

  3、引用类型传递参数到底传的是值还是引用?


 代码如下:


  function setName(obj){

    obj.name="ABC";

    obj=new Object();

    obj.name="BCD";

  }

  var person=new Object();

  setName(person);

  alert(person.name);// ABC



   执行结果是:ABC。实例3与实例2的区别是在函数中又加了2行代码,在给obj对象新加一个属性name并赋值后 又将obj定义成了一个新的对象(new Object()),定义新对象后又name赋上新的值“BCD”。这个时候如果是按引用传递的话,那么最后person对象就会自动修改为指向其 name属性为"BCD"的新对象,但最后显示的却是“ABC”,这说明即使在函数内部修改了参数的值,但原始的引用还保持不变。实际上,当在函数内部 obj=new Object()时 这个新的obj就已经成为函数内部的局部对象了,这个对象会在函数执行完毕后自动销毁。

转自:http://www.58action.com/a/wzjx/wyzhz/2012/0328/1627.html

发布者

小懿

RingCentral敏捷教练 不懂技术的产品经理不是好教练!

发表评论

邮箱地址不会被公开。 必填项已用*标注