一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情。
问题由来
基础数据类型放在栈内存,复杂数据类型放在堆内存。 不仅是JavaScript,连Java等众多编程语言都同样的设计,似乎已经是业界标准。
那为什么基础数据类型,一定要放在栈结构的内存呢?队列结构、链表结构不行嘛?
主要是两点原因
- 直接到底层硬件,存取效率高
栈结构和队列与链表不同,是能直接存到底层寄存器的。所以存取效率高。
- 基础数据类型和栈结构,内存空间都是固定大小的
基础数据就类型的内存大小是固定的。别看String
字符串似乎包罗万象,但也有边界的,Number所能够表达的数值范围也限定于Number.MIN_VALUE
到Number.MAX_VALUE
之间,Boolean和Symbol类型就更不必说了。
而栈内存,恰好也是固定空间大小的。不仅是栈帧(栈结构的每一项元素大小),而且整个栈深(帧结构的整体大小)都是固定大小的,如果存放东西过多,就会栈溢出。
固定的内存空间位置意味着什么?想象一下,在海上漂泊摇晃的舰炮命中率更高,还是固定的岸炮命中率高?答案不言自明。
所以就这两点来看,基础数据类型,就特别适合放在栈内存。甚至可以说,栈内存几乎就是为基础数据类型,量身定做的一样。
未解之谜
我们所知道的,栈结构的特点是“先进后出”,就好像JS函数调用栈(Call Stack)一样,正是具备“先进后出”的特点,才保障了函数嵌套时的执行顺序。先把里面的函数执行完,再执行外层的函数。
那“先进后出”的栈结构,对于基础数据类型的存取,有什么好处呢?