基本数据类型和引用类型

js将数据类型分为基础类型和引用类型,通俗地讲,基础类型都是单一结构,而引用类型都可以看做对象,即复合结构。二者在复制时会有不同的行为,且不同类型在函数传值时的表现也不同,本文将带领大家发现二者之间的不同和类似之处。
首先要介绍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里就不用管了。

 

以上就是本人总结的基本数据类型和引用类型的一些异同,由于本人也是初学者,难免会发生一些错误,望各位网友批评指正,互相学习。