您的位置:首页 > 其它

关于变量的传递方式

2017-03-26 10:57 246 查看
在JS中,变量到底是按值传递还是按引用传递的呢?要弄清楚这个问题,我们得首先熟悉下面的一些概念:

在JS中,数据类型分为基本类型值(Undefined;Null;Boolean;Number;String)和引用类型值(即对象类型:Object、Array、Function、Date等)

那什么是按值传递呢?举个例子:

例:

var a=1;

var b=a;

console.log(b);//1

这个例子很好理解,我们都知道a的值是1,然后把a的值赋予给b,所以b也是1,但是这个两个1是相互独立的,b中的1相当于a中的1复制的副本,改变其中任何一个的值都不会对另外一个造成影响:

b+=1;

console.log(b);//2

console.log(a);//1

这个就是按值传递。

 

再来说一下按引用传递:

例:

var obj1={

  name:”100”

};

var obj2=obj1;

console.log(obj2.name);//100

obj2.name=”111”;

console.log(obj2.name);//111

console.log(obj1.name);//111

第一次打印出来的是100,这个我们很容易理解,但是第二次打印的却是111,这是为什么呢?这个就是按引用传递和按值传递的不同之处。在引用传递中,复制对象时,并不会在堆的内存中新生成一个一模一样的对象,只是多了一个指向这个对象指针的变量罢了。将obj1的值复制给obj2,而这个值的副本就是一个指针,这个指针指向存储在堆中的一个对象,也就是说创建了一个新的内存地
4000
址传给了obj2,obj1和obj2同时指向同一个对象,当去改变这个对象时,它们的值都会改变,即如果改变它们当中任意一个的值,另外一个也会跟着改变,如上面的例子中改变”obj2.name”的值之后,obj1.name”的值也由原来的”100”变成了”111”。

 

再看下面的例子:

例:

var person={

   name:”Zhangsan”

};

function obj(change){

   change.name=”Lisi”;

   return change;

}

var result=obj(person);

console.log(result.name);//Lisi

console.log(person.name);//Lisi

从运行结果上面看,我们似乎觉得这是按引用传递,不急,我们再来看下面的例子:

var person={

   name:”Zhangsan”

};

function obj(change){

   change ={

name:Lisi

}

   return change;

}

var result=obj(person);

console.log(result.name);//Lisi

console.log(person.name);//Zhangsan

在上面的例子中,在函数内重新定义了一个对象,也就是说现在堆内存中含有两个对象,外部person指向的是老的对象,被传入参数后指向的是新定义的对象,所以调用返回的值是新定义对象的值,而如果是按引用传递的话,那么person.name打印出来的是Lisi,所以证明是按值传递的。

 

通过以上分析,我们可以得出:在JS中,变量都是按值传递的!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐