前言:本文讨论javascript中值传递和引用传递的问题,部分参考自《JavaScript高级程序设计》
基本数据类型和引用数据类型:
基本数据类型:
ECMScript定义了五种基本数据类型,分别是:Null,Undefined,Number,String,Boolean。这五种数据类型是按值访问的,因为可以操作保存在变量中的值。
引用数据类型:
引用类型数据包括一切的object,类似Date,Array。引用数据类型的值是保存在内存中的对象,JavaScript是不允许直接访问内存中的位置,就是说不能直接操作对象的内存空间,所以在操作对象时,实际上是操作对象的引用而不是实际的对象。所以引用类型的值是按引用访问的。
添加属性:
在引用类型中我们可以添加对象属性,而在基本数据类型中不可以,虽然不会报错
var g=new Object();
g.name="haha";
alert(g.name);//haha
基本数据类型
var d="people";
d.name="xixi";
alert(d.name);//undefined
复制变量值时:
在基本类型中,复制变量实际上是复制了变量的一个副本,在新的变量上修改,也不会互相影响,
var num=5;
var num2=num;//复制了num的一个副本赋值给num2
而在引用数据类型中,与基本类型不同的是,复制引用类型的值时,同样是复制一份放到新的内存空间,但是这个值得副本实际上是一个指针,指向堆内存中的对象,所以复制完成后,两个变量引用一个对象,他们任何一个作修改,都会改变另一个变量。
var obj1=new Object();
var obj2=obj1;
obj2.name="2";
alert(obj1.name);//2
引用红宝书的一张图方便理解:
在函数中传递参数:
ECMScript中所有函数参数都是值传递,基本类型值传递如基本类型变量复制一样,而引用数据类型传递则和引用类型变量复制一样,所以就有下面的区别:
基本类型值传递
function add(num){
num+=1;
return num;
}
var n=3;
var m=add(n);
alert(n);//3
alert(m);//4
引用类型值传递:
function setName(obj){
obj.name="xixi";
}
var person=new Object();
setName(person);
alert(person.name);//xixi
技术博客:https://gdmec07140603.github.io/ 欢迎访问