《Js 简单类型与复杂类型》
简单类型又叫做基本数据类型或者值类型,复杂类型又叫做引用类型。
值类型(按值访问):简单数据类型/基本数据类型,在存储时变量中存储的是值本身,因此叫做值类型,string ,number,boolean,undefined,null
引用类型 (按引用访问) :复杂数据类型,在存储时变量中存储的仅仅是地址(引用),因此叫做引用数据类型,通过new 关键字创建的对象(内置对象、自定义对象),如Object、Array、Date等
介绍一下堆和栈
栈 (stack) : 用来保存简单的数据字段
堆 (heap) : 用来保存栈中简单数据字段对指针的引用
区别:
1、栈(操作系统):由操作系统自动分配释放存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈;
简单数据类型存放到栈里面
2、堆(操作系统):存储复杂类型(对象),一般由程序员分配释放,若程序员不释放,由垃圾回收机制回收;
复杂数据类型存放到堆里面
基本类型、引用类型数据以及 堆栈的关系如下图:
如上图所示,栈内存中 关于 引用类型的数据的是通过指针(地址)也就是引用来引用的,直接指向堆内存中的数据。
为啥为导致上述区别,是因为:
2、引用类型数据比较复杂,复杂程度是动态的,计算机为了较少反复的创建和回收引用类型数据所带来的损耗,就先为其开辟另外一部分空间——即堆内存,以便于这些占用空间较大的数据重复利用。
堆内存中的数据不会随着方法的结束立即销毁,有可能该对象会被其它方法所引用,直到系统的垃圾回收机制检索到该对象没有被任何方法所引用的时候才会对其进行回收
(基本数据类型):
var a = 1;
var b = a;
b = 2;
console.log(a, b) // 1, 2
执行上述代码 var b = a 过程中,系统会为 b 单独创建一个空间(实际上就是在栈内存中把值复制一份给b,仅仅只是值),当 执行 b = 2 的时候,所以就和 a 没有任何关系

(复杂数据类型1):
var obj1 = {a: 1, b: 2}; // 对象,复杂数据类型
var obj2 = obj1;
obj2.a = 20;
console.log(obj1.a, obj2.a) // 20, 20
当执行上述代码 obj2 = obj1 的时候,是将 obj1的指针在栈内存中复制一份给 obj2,也就是说 obj1 和 obj2 的指针其实指向的是同一个数据地址(堆内存中);
当执行 obj2 = 20 时,修改了堆内存中的数据,所以打印obj1的相关属性,其值也会发生变化。

(复杂数据类型2):

此处
new出来一个对象(实例化),同上。
浙公网安备 33010602011771号