前言:从JavaScript自动垃圾回收机制说起
我们都知道JavaScript具有自动垃圾回收机制,内存的分配和回收都现实了自动管理,这样内存空间的知识容易被我们忽视,但是知道JavaScript是如何在内存中进行数据的存储,可以更好帮助我们理解引用数据类型和引用传递是怎么回事,还有闭包、原型等等。
0x01.说说堆和栈
其实在JavaScript中并没有严格意义上的栈内存和堆内存的区分,但是堆内存和栈内存依旧是有本质的差别,理解堆栈数据结构的原理和特点也很重要
栈的主要遵循先进后出,后进先出的特点
图中用兵兵球盒子与栈内比,那么通过图片可以理解当我们想取出兵兵球1的时候,就必须先将上面的4个球给取出来(依次出栈),这样让兵兵球1处于栈顶,这也是栈空间先进后出,后进先出的特点
通过栈空间的工作特点我们知道有时候我们取一些底层的数据并不方便,那么堆空间可以很好的解决这个问题,堆存储数据的原理可以理解为一种key-value的方式,我们知道在JSON格式的数据中,存储的方式就是键值对的,这种方式存储的数据是无序的,方便我们查找调用。
0x02.变量对象和基础数据类型
我们知道在JavaScript中有5种基础的数据类型,分别是Undefine、Null、Boolean、Number、String
,这些基础的数据类型都是一些简单的数据段,通常我们将其保存在一个叫做变量对象(一种特殊对象)中。基本的数据类型都是按值访问,因此可以直接操作保存在变量中的值。
0x03引用数据类型与堆内存
在JS的引用数据类型中,如数组Array,它的值大小是不固定的,引用数据类型的值是保存在堆内存中的对象(object)。但是在JS中是不允许直接访问堆内存中的位置的,因而在实际操作对象的时候我们我们是从变量对象中访问对象的地址引用(这里可以理解为一种地址指针),然后再通过从堆内存中获取我们所需要的数据。
在对象b、c中对应的值是存储的地址,通过该地址来取堆内存中存储的数据。
dome
var m ={a:10,b:15}
var n=m;
n.a=15
//此时m.a的值?
当通过var n=m
执行的是一次复制引用类型的操作,引用类型的复制会为新的变量分配一个新的值保存在变量对象中,需要注意的是这个值只是引用类型的一个地址指针,因此尽管m和n在变量对象的相互独立,但是他们指向的堆内存空间的具体对象是一致的。
因此当我们改变n的时候,m也发生了变化,这就是引用类型的特性!