栈内存和堆内存的区别

前言

  • 基本类型值在内存中占据固定大小的空间,所以被保存在栈内存中。
  • 引用类型的值是对象,保存在堆内存中。

注意

这里是指把它们的值按类型保存在栈/堆中。

什么是栈

栈(stack)又名堆栈,是一种遵循后进先出(LIFO)原则的有序集合。新添加或待删除的元素都保存在栈的末尾,称作栈顶,另一端称作栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。

这就类比羽毛球槽,先放进去的羽毛球,最后才能被取出来。

什么是堆

堆(heap)是无序的,它们是以 key-value 键值对形式存储。

这就类比电话簿找某人的电话号码,你只要知道他的名字就可以了,无需像栈一样,把前面的名字都筛查一遍。

比较优缺点

在 JavaScript 中,基本数据类型变量大小固定,并且操作简单容易,所以把它们放入栈中存储。引用类型变量大小不固定,所以把它们分配给堆中,让他们申请空间的时候自己确定大小,这样把它们分开存储能够使得程序运行起来占用的内存最小。

栈内存由于它的特点,所以它的系统效率较高。堆内存需要分配空间和地址,还要把地址存到栈中,所以效率低于栈。

js中栈内存和堆内存

垃圾回收

栈内存中变量一般在它的当前执行环境结束就会被销毁被垃圾回收制回收,而堆内存中的变量则不会,因为不确定其他的地方是不是还有一些对它的引用。堆内存中的变量只有在所有对它的引用都结束的时候才会被回收。