基本类型和引用类型的传值

ECMAScript变量可能包含两种不同数据类型的值:基本数据类型值和引用类型值

基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象。

1.动态的属性

  定义基本类型值和引用类型值的方式都是定义一个变量并为该变量赋值。我们可以对引用类型值的变量进行添加属性和方法。

2.复制变量值

  从一个变量向另外一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上如下:

  

1 var num1=5;
2 var num2=num1;

  在这里num1中保存的是5,当使用num1来初始化num2时,num2中也保存了5,但是num2中5与num1并没有关系,该值是num1中5的一个副本,你可以对num1做任何操作而不影响num2.

  但如果是一个变量向另一变量复制引用类型的值时,同样也会将存储在变量中值复制一份到新变量中,但是复制的是一个指针,而这个指针指向存储在堆中一个对象,实际上两个变量引用的是同一个对象,如下面列子所示:

var obj1=new Object();
var obj2=obj1;
obj1.name="zp";
alert(obj2.name); //"zp"

 3传参

  ECMAScript中所以函数的参数都是按值传递的,也就是说,把函数以外的值复制给函数内部的参数,就跟把值从一个变量复制到另外一个变量一样,基本类型还是按照基本类型的传递,引用类型的还是按照引用类型的传递。

  在向参数传递基本类型值时,被传递的值会被复制给一个局部变量(即命名参数,或者用ECMAScript的概念来说就是arguments对象中一个元素)。在向参数传递引用类型的值的时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变换也会反映在函数的外部。

function addTen(num){
  num+=10;
  return num;
}
var count=20;
var result=addTen(count);
alert(count);   //20
alert(result);   //30

   这里addTen()有一个参数num,而参数实际上是函数的局部变量,在调用这个函数时,变量count作为参数传递给addTen,这个变量的值是20,于是,按照基本类型的值传递,20被复制给参数num,函数的返回值是30,而num和count并没有关系,它们紧紧是值相同。如果是按照引用传递的话,那么变量count的值也会变成30,从而反映函数内部的修改。下面是一个使用对象作为参数的例子:

  

function setName(o){
  o.name="zp";
}
var person=new Object();
setName(person);
alert(person.name);  //"zp"

   以上代码似乎在说明参数是按照引用传递的,因为在函数内部的修改反映到外部的person中。因为在内存中person指向的对象只有一个,而且是全局对象。为了证明是按值传递的,接下来提供了下面一个例子

function setName(obj){
  obj.name="zp";
  obj=new Object();
  obj.name="xyq";
}
var person=new Object();
setName(person);
alert(person.name); //"zp"

   这个代码在上面的基础上添加两行代码,重新再函数内部给obj参数赋值了,如果按照引用传递,此时外面的person对象应该指向其name的值为xyq的新对象,但是person对象还是指向原来的对象,这说明在函数内部修改了参数的值,但是原始的引用值还是不会变,实际上在函数内部重新obj时,obj这个变量的引用的就是一个局部对象了,而这个局部对象在函数执行完后就销毁了。

   就写到这,是对引用类型和基本类型的基础知识的一点记录。

 

posted @ 2012-09-06 22:25  我欲成魔  阅读(314)  评论(0编辑  收藏  举报