Skip to content
快看这页儿写了啥...

什么是栈、堆,有何区别?

题干

  • 栈、堆

  • 存储

题解

JavaScript 中,栈(Stack)和堆(Heap)是两种不同的内存区域,用于存储不同类型的数据。

  1. 栈(Stack):

    • 栈在 JavaScript 中用于存储基本类型的值和引用类型的引用。
    • 基本类型的值(如数字、布尔值、字符串等)直接存储在栈中,它们的大小固定且占用的内存空间较小。
    • 引用类型的值(如对象、数组、函数等)存储在栈中的是它们的引用(或地址),而实际的数据存储在堆中。
    • 栈采用后进先出(LIFO)的存储方式,每当函数被调用时,会在栈上创建一个新的执行上下文(Execution Context),包括函数的参数、局部变量和返回地址。当函数执行完毕后,对应的执行上下文会被销毁,栈会自动释放相应的内存。
  2. 堆(Heap):

    • 堆在 JavaScript 中用于存储引用类型的实际数据。
    • 引用类型的值(如对象、数组、函数等)的数据存储在堆中,堆是一种动态分配的内存区域,大小不固定。
    • 当创建一个对象时,会在堆中分配一块内存来存储该对象的属性和方法。变量中存储的是对象在堆中的引用。
    • 堆的内存管理是由 JavaScript 引擎的垃圾回收机制来处理的。当一个对象不再被引用时,垃圾回收机制会自动回收该对象所占用的内存空间。

区别总结:

  • 栈用于存储基本类型的值和引用类型的引用,数据直接存储在栈中。
  • 堆用于存储引用类型的实际数据,数据存储在堆中,而变量中存储的是对象在堆中的引用。
  • 栈的大小固定且较小,堆的大小不固定且较大。
  • 栈的分配和释放是自动进行的,堆的分配和释放是由垃圾回收机制自动处理的。
  • 栈采用后进先出(LIFO)的存储方式,堆是动态分配的内存区域。

了解栈和堆的区别有助于理解 JavaScript 中的内存管理机制,以及如何正确地使用和释放内存。

贡献者

isboyjc's avatar isboyjc

浏览量(PV)  次  ·  独立访客(UV)  人次
不正经的前端 | 八股 · 欢迎 star ⭐