js:具有自动的垃圾回收机制。
找出那些不再继续使用的变量,然后释放其占用的内存。
回收的方式:
- (1)标记清除【js中常用】
- (2)引用计数
js没有严格意义上区分栈内存与堆内存,可以简单理解为JavaScript的所有数据都保存在堆内存中。
1 栈(stack)
js执行上下文的执行顺序借用了栈数据结构的存取方式。(函数调用栈)
栈数据结构:先进后出,后进先出。
2 堆(heap)
堆数据结构:树状结构,
好比在JSON格式的数据中,我们存储的key-value是可以无序的,顺序的不同并不影响我们的使用。
3 队列(queue)
先进先出(FIFO)的数据结构。
4 变量对象与基础数据类型
JS的执行上下文生成后,会创建一个叫变量对象的特殊对象,js的基础数据类型会保存在变量对象中。(严格来说:变量对象也是存放于堆内存中,由于变量对象的特殊职能,理解时单独区分)
基础数据类型:简单的数据段,按值访问,可直接操作保存在变量中的实际值,js中5中基础数据类型:Undefined、Null、Boolean、Number、String。(暂不考虑ES6的Symbol)
5 引用数据类型与堆内存
JS的引用数据类型(数组Array)值的大小是不固定的,其值是保存在堆内存中的对象。
JavaScript不允许直接访问堆内存中的数据,因此不能直接操作对象的堆内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。因此,引用类型的值都是按引用访问的。这里的引用,我们可以理解为保存在变量对象中的一个地址,该地址与堆内存的实际值相关联。
6 内存空间管理
JavaScript的内存生命周期
- 分配你所需要的内存
- 使用分配到的内存(读、写)
- 不需要时将其释放、归还