栈内存、堆内存、队列

在学习内存空间之前,我们需要对三种数据结构有一个直观的认知,它们分别是:栈(stack)、堆(heap)与队列(queue)。

一、栈数据结构

JavaScript中并没有严格意义上区分 栈内存堆内存
但是在某些场景,我们仍然需要基于堆栈数据结构的思维来实现一些功能,比如:JavaScript的执行上下文,执行上下文的执行顺序借用了栈数据结构的存取方式。因此理解栈数据结构的原理与特点十分重要。

要简单理解栈的存取方式,我们可以通过类比乒乓球盒子来分析。如下图左侧。

栈内存、堆内存、队列_第1张图片
栈内存 - 类比乒乓球盒子 - 先进后出,后进先出

这种乒乓球的存放方式与栈中存取数据的方式如出一辙。处于盒子中最顶层的乒乓球5,它一定是最后被放进去,但可以最先被使用。而我们想要使用底层的乒乓球1,就必须将上面的4个乒乓球取出来,让乒乓球1处于盒子顶层。
这就是栈空间 先进后出,后进先出的特点。

二、堆数据结构

堆数据结构是一种树状结构。它的存取数据的方式,则与 书架与书 非常相似。

书虽然也整齐的存放在书架上,但是我们只要知道书的名字,我们就可以很方便的取出我们想要的书,而不用像从乒乓球盒子里取乒乓一样,非得将上面的所有乒乓球拿出来才能取到中间的某一个乒乓球。
好比在JSON格式的数据中,我们存储的key-value是可以无序的,因为顺序的不同并不影响我们的使用,我们只需要关心书的名字。

三、队列

在JavaScript中,理解队列数据结构的目的主要是为了清晰的明白事件循环(Event Loop)的机制到底是怎么回事。
队列是一种先进先出(FIFO)的数据结构。正如排队过安检一样,排在队伍前面的人一定是最先过检的人。用以下的图示可以清楚的理解队列的原理。

栈内存、堆内存、队列_第2张图片
队列 - 先进先出 - 过安检

参考资料

  • 内存空间详解

你可能感兴趣的:(栈内存、堆内存、队列)