JavaScript内存分配中heap与stack的存储规则相关问题咨询
JavaScript 堆(heap)与栈(stack)内存分配问题解答
你提到的两个说法均不符合JavaScript的内存分配规则,以下是具体解释:
问题1:堆是否仅包含指针,栈才是实际数据的存放位置?
- 结论:错误
- 首先明确JS中两类内存区域的常规存储内容:
- 栈内存:主要存储函数执行上下文、原始类型(
Number/String/Boolean/Undefined/Null/Symbol/BigInt)的实际值、引用类型的指针(指向堆内存的地址),栈内存分配和销毁速度极快,随函数执行完毕自动释放。 - 堆内存:主要存储引用类型的实际数据实体,包括对象、数组、函数的完整结构数据,其中既包含指向其他堆实体的指针,也包含直接存储的原始类型属性值,并不是只有指针。
- 栈内存:主要存储函数执行上下文、原始类型(
- 代码示例佐证:
// name是原始类型,值"张三"直接存在栈内存 let name = "张三"; // user是引用类型,栈内存仅存指向堆的指针,完整对象实体存在堆中 let user = { age: 18, // 18是原始类型值,直接存在堆内的user对象结构中,不在栈里 hobby: ['打球', '听歌'] // hobby属性值是指针,指向堆中另一个数组实体 };
上述示例里堆内存直接存储了18、'打球'、'听歌'这些实际数据,足以证明堆不是仅存指针的区域。
问题2:堆内存区域的指针要么指向堆内其他指针,要么指向栈区域存储的数值,该说法是否正确?
- 结论:错误
- 两点核心原因可以推翻该说法:
- 堆内存中的指针指向的是堆内的实际数据实体,而非堆内的其他指针。比如上例中
user.hobby的指针直接指向堆里的数组实体,不是指向另一个指针。 - 堆内存的指针永远不会指向栈区域的数值。栈内存的生命周期和函数执行绑定,函数执行完毕对应的栈帧就会被销毁回收,如果堆指针指向栈地址,会出现野指针访问的问题,JS的内存模型完全禁止这种设计。
- 堆内存中的指针指向的是堆内的实际数据实体,而非堆内的其他指针。比如上例中
- 补充:所有引用类型的指针,不管是存在栈里的还是存在堆里的,指向的都是堆内存中的实际数据地址,不存在指向栈的情况。
内容的提问来源于stack exchange,提问作者Slev7n
相关产品推荐
相关产品推荐

