关于变量的传递方式
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中,变量都是按值传递的!
在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中,变量都是按值传递的!
相关文章推荐
- 关于delphi 的函数调用和参数传递方式深入研究之疑惑
- 关于vbscript 与 javascript如何传递变量(包括服务器端与客户端)
- Android 用application保存全局变量,关于Android中传递数据的一些讨论
- 关于js中的传递方式
- 在编写个人函数的时候,你将会受到C++中的一条基本的原则的限制:在默认的情况下,变量只能以值传递的方式传递给函数。这句话的意思是:被传递到函数的只是变量的值,永远不是变量的本身。
- 关于vbscript 与 javascript如何传递变量(包括服务器端与客户端)
- 为什么我用ajax以post方式传递变量时只要开头有空格就会得不到任何值?
- 关于NSUserDefaults保存自定义变量的方式
- VC中控件和变量之间数据传递的方式
- [求助]关于变量传递的问题……
- Intent传递参数简介与android方式的全局变量
- 2012.4.16笔记2--引用变量,按引用方式传递参数
- Android 用application保存全局变量,关于Android中传递数据的一些讨论
- Javascript与ASP.NET(一般处理程序)关于URL(get方式)传递中文乱码问题的解决方案
- 关于vbscript 与 javascript如何传递变量(包括服务器端与客户端)
- 关于"Java中方法参数的传递方式"的探讨
- 关于 ios 页面信息传递方式 delegate 和 NSNotificationCenter
- 关于vbscript 与 javascript如何传递变量(包括服务器端与客户端)
- 关于指针作为函数参数传递的理解,对比普通变量作为函数参数的需注意点,其实就是行参和实参的问题。
- C-关于结构体变量和结构体指针变量函数传递值得问题