javascript引用类型数据存于堆内存,变量仅存指向堆的地址;访问时通过地址+偏移量定位属性,不按名称搜索;垃圾回收依赖可达性分析而非名称匹配。

JavaScript 中引用数据类型(如对象、数组、函数、Map、Set 等)本身存储在堆内存中,而变量中保存的只是指向堆中该值的内存地址(引用)。查找过程不涉及“在堆里按名字搜索”,而是通过变量持有的地址直接访问对应位置。
堆内存没有“键名查找”,只有地址寻址
堆内存不是哈希表,它不支持按变量名或属性名去“查找”某个对象。JS 引擎在创建引用类型时:
- 在堆中分配一块连续内存,存放实际数据(如对象的属性键值对、数组元素等)
- 生成一个唯一内存地址(例如 0x1a2b3c),并把这个地址赋给栈中的变量(如
let obj = {x: 1}中的obj) - 后续访问
obj.x时,引擎先从栈拿到obj的地址,再跳转到堆中那个地址,再按对象内部结构偏移定位到x字段
属性访问是“地址 + 偏移量”计算,不是全局搜索
对象属性并不单独存为堆中的独立项。以 {a: 1, b: 2} 为例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 整个对象被紧凑布局在堆中一段内存,可能像:
[type_header][a_value][b_value] - V8 等引擎会为对象建立隐藏类(hidden class)或形状(shape),记录属性顺序和偏移量
-
obj.a实际是:取obj地址 + 固定偏移(比如 +4 字节)→ 读取该位置的值
垃圾回收器才真正“扫描堆”,但也不靠名字
当变量不再被任何栈/闭包/其他对象引用时,GC 会标记这块堆内存为可回收。它通过可达性分析(reachability)**,从根对象(全局对象、调用栈变量等)出发,顺着所有引用地址遍历,未被遍历到的堆内存即为“不可达”,随后清除——这个过程依然不查名称,只跟踪地址链。
你无法手动“查找”堆地址,但可以观察引用关系
开发者不能直接获取或搜索堆地址(JS 层面无指针操作),但可通过以下方式间接验证引用行为:
- 两个变量赋值同一对象 → 它们地址相同 → 修改一个,另一个可见变化
-
console.log(obj)显示的是对象摘要,不是地址;obj === anotherObj比较的是地址是否一致 - 使用 Chrome DevTools 的 Memory 面板可拍堆快照,按构造函数或保留路径筛选对象,本质仍是分析引用图
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










