为什么JS基础数据类型要放栈内存?

961 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

问题由来

基础数据类型放在栈内存,复杂数据类型放在堆内存。 不仅是JavaScript,连Java等众多编程语言都同样的设计,似乎已经是业界标准。

那为什么基础数据类型,一定要放在栈结构的内存呢?队列结构、链表结构不行嘛?

主要是两点原因

  • 直接到底层硬件,存取效率高

栈结构和队列与链表不同,是能直接存到底层寄存器的。所以存取效率高。

  • 基础数据类型和栈结构,内存空间都是固定大小的

基础数据就类型的内存大小是固定的。别看String字符串似乎包罗万象,但也有边界的,Number所能够表达的数值范围也限定于Number.MIN_VALUENumber.MAX_VALUE之间,Boolean和Symbol类型就更不必说了。

而栈内存,恰好也是固定空间大小的。不仅是栈帧(栈结构的每一项元素大小),而且整个栈深(帧结构的整体大小)都是固定大小的,如果存放东西过多,就会栈溢出。

固定的内存空间位置意味着什么?想象一下,在海上漂泊摇晃的舰炮命中率更高,还是固定的岸炮命中率高?答案不言自明。

所以就这两点来看,基础数据类型,就特别适合放在栈内存。甚至可以说,栈内存几乎就是为基础数据类型,量身定做的一样。

未解之谜

我们所知道的,栈结构的特点是“先进后出”,就好像JS函数调用栈(Call Stack)一样,正是具备“先进后出”的特点,才保障了函数嵌套时的执行顺序。先把里面的函数执行完,再执行外层的函数。

那“先进后出”的栈结构,对于基础数据类型的存取,有什么好处呢?