内存空间与数据类型

Posted sherrycat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存空间与数据类型相关的知识,希望对你有一定的参考价值。

一、javascript中常用数据结构

1、栈数据结构

技术图片

 

 

 先入 后出

JavaScript的执行上下文

2、堆数据结构

堆数据结构是一种树状结构。它的存取数据的方式,类似于书架。只要知道书的名字,就可以取出相应的书。

JavaScript中所有数据都保存在堆内存中(※)

3、队列

队列如同排队安检。先入先出,后入后厨

事件循环(Event Loop)机制

二、基础数据类型与变量对象

JavaScript执行上下文生成后,会创建变量对象。变量对象也是一个对象。

JavaScript的数据类型保存在变量对象中。其实变量对象也是存放于堆内存中的,只是由于变量对象的特殊职能,理解的时候需要将其区分开:

技术图片

 

JavaScript中有5种基础数据类型:undefined、Null、Boolean、Number、String(※)(还有一种基础数据类型Symbol,暂不考虑)

基础类型都是按值访问,可以直接操作保存在变量中的实际的值。如上图a、b、c。

三、引用数据类型与堆内存

与其它语言不同,JavaScript的引用数据类型的值大小不固定。引用数据的值是保存在堆内存中的对象。

JavaScript中的引用数据类型:Object、Function、Array、Date、RegExp(※)

JavaScript不允许直接访问堆内存中的位置,操作对象时,实际上操作的是对象的引用,而不是实际对象。这里的引用可以理解为地址或指针的值。对于上图:

var a = 20; //变量对象

var d =  m:20 //将变量b存放于变量对象中,  m:20作为对象存放于堆内存中

可以说引用类型是按引用访问,但这种说法不严密。因为当复制保存着对象的某个变量时,操作的是对象的引用;但当给某个对象添加属性时,操作的是实际的对象。

四、内存空间管理

1.JavaScript生命周期:

(1)分配所需要内存

(2)使用分配到的内存(读、写)

(3)不需要时将其释放、归还

var a = 20;  // 在内存中给数值变量分配空间
alert(a + 100);  // 使用内存
a = null; // 使用完毕之后,释放内存空间

第三部释放内存空间需要重点了解。

2.垃圾收集机制

常用的处理机制为标记清除

标记清除算法从名称上看,可以拆分为两部分:标记(mark)和清除(sweep)。

此算法可以分为两个阶段,一个是标记阶段,一个是清除阶段,下面就分别做一下介绍。

(1)标记阶段:

在此阶段,垃圾回收器会从mutator(应用程序)根对象开始遍历。

每一个可以从根对象访问到的对象都会被添加一个标识,于是这个对象就被标识为可到达对象。

(2)清除阶段:

在此阶段中,垃圾回收器,会对堆内存从头到尾进行线性遍历,如果发现有对象没有被标识为可到达对象,那么就将此对象占用的内存回收,并且将原来标记为可到达对象的标识清除,以便进行下一次垃圾回收操作。

在上述代码中,a = null其实仅仅只做了一个释放引用的操作,让a原本对应的值失去引用,脱离执行环境,这个值就会在下一次垃圾收集器执行操作时被找到然后释放。

以上是关于内存空间与数据类型的主要内容,如果未能解决你的问题,请参考以下文章

变量与基本数据类型

可变类型与不可变类型的特点

可变类型与不可变类型的特点

程序的砖瓦------变量与数据类型(06)

python可变类型与不可变类型

java中的基本数据类型与封装类