基本数据类型和引用类型
hygperses 人气:0js将数据类型分为基础类型和引用类型,通俗地讲,基础类型都是单一结构,而引用类型都可以看做对象,即复合结构。二者在复制时会有不同的行为,且不同类型在函数传值时的表现也不同,本文将带领大家发现二者之间的不同和类似之处。
首先要介绍js的内存模型:
首先,js内存区域分为堆和栈,先介绍栈的部分
js运行时,会存在一个运行环境,这一部分及作用域的概念已于作用域部分进行介绍,在此不多赘述。而系统会在每个运行环境中建立一个变量对象,用于保存那些存在于该运行环境中的变量,这个变量对象就保存于栈中。
而堆中则用于保存其余所有的对象,包括用户自己创建的对象等。
对于保存基本数据类型的变量,其值全部保存在变量对象中,即存储于栈中,而保存引用类型的变量,其引用的对象保存在堆中,而变量中保存的是其引用,即其在堆中的地址。
var x=10; var y=new Object();
一.二者复制时的情形
1.基本数据类型在复制时会将值传递给新的变量,在那之后新旧变量之间没有任何关系。
如:
var x=10; var y=x; y++; console.log(x); console.log(y);
结果为:
2.引用类型复制时仅将引用值传递给新变量,在那之后二者同时指向同一个对象,因此对该对象进行的操作同时影响两个变量
如:
var x=new Object(); var y=x; y.num=10; console.log(x.num); console.log(y.num);
结果为:
总结:
其实很容易发现,复制时仅将栈内变量对象中对应变量的值赋值给了新变量,只不过二者保存的内容不同才导致所谓的传值和传引用的不同。
二.函数传值时二者的表现
js函数参数的传递一律使用传值,按上述总结的结果,可得出如下情形
1.基本数据类型
由上文可推知,传递到函数中的值应当与原变量毫无关系,以下来验证该推理:
var x=10; console.log("传递参数之前x的值:"); console.log(x); function add1(num){ num++; } add1(x); console.log("传递参数之后x的值:"); console.log(x);
结果为:
说明函数中的++操作并未影响到x,由此得证
2.引用类型
同理可推知,函数中的参数一定是得到了原变量中引用的地址值,从而也指向了同一个堆中对象,因此函数中对该值的改变会波及原变量
var x=new Object(); x.num=20; function add2(ref){ ref.num++; } add2(x); console.log(x.num);
结果为:
得证
三.传引用
前面提到js中函数参数一律采用传值,那所谓的传引用又是什么情形呢?
以基本数据类型为例,传值是将变量中的值赋值给新变量,那么传引用其实就是将原变量的引用,即地址传递给新变量,从而使得新旧变量相互绑定,新变量名可以看做是原变量的别名,改变新变量的值也会影响原变量。这个概念会出现在C++中,而在js里就不用管了。
以上就是本人总结的基本数据类型和引用类型的一些异同,由于本人也是初学者,难免会发生一些错误,望各位网友批评指正,互相学习。
加载全部内容