是否有方法获取JavaScript变量的内存地址?
JavaScript 是否可以获取变量内存地址?
核心结论:ECMAScript 标准没有提供任何可以直接获取变量/值内存地址的公开API,普通业务代码里没有合规的方法拿到这个信息。
为什么[1,2,3] === [1,2,3]返回false
要理解这个现象,首先要搞清楚JS的相等判断规则:
- 对原始类型(
string/number/boolean/null/undefined/symbol/bigint),===比较的是值本身是否完全相等 - 对引用类型(数组、普通对象、函数等),
===比较的是两个值是否指向堆内存中的同一个实例,本质就是比较两者的内存引用是否一致。
代码里写的两个[1,2,3]是分别独立创建的两个数组实例,哪怕存储的元素完全相同,也是存在堆内存不同位置的两个独立对象,引用地址不一样,所以比较结果自然是false。
可以看这段代码的对比:
// 新建一个数组实例,赋值给变量a const a = [1, 2, 3] // 把a持有的引用直接赋值给b,b和a指向同一个数组 const b = a console.log(a === b) // 输出true,两者引用完全一致 // 再新建一个内容完全一样的数组实例 const c = [1, 2, 3] console.log(a === c) // 输出false,c是独立创建的新实例,内存地址和a不同
为什么JS不暴露内存地址
JS是自动内存管理的高级语言,底层内存操作完全由JS引擎(比如V8、SpiderMonkey)托管:
- 引擎会在运行时自动做垃圾回收、内存整理(比如内存压缩、对象在新生代/老生代之间晋升),对象的实际内存位置会在运行过程中动态变化,就算你某一刻拿到了地址,下一秒这个地址就可能因为内存移动失效,没有稳定的使用价值。
- 暴露内存地址会带来严重的安全问题,也会打破JS现有的内存安全模型,所以标准层面永远不会提供这类接口。
如果是调试场景,可以通过Chrome DevTools的Memory面板拍内存快照,查看对象的内存分配情况,但这是调试工具的专属能力,无法在业务代码中调用。
和字符串可变性的关系
JS中的字符串是原始类型,存储在栈内存或者引擎专门维护的字符串常量池中,具备不可变性:任何对字符串的修改操作(拼接、截取、替换等)都会生成一个全新的字符串,永远不会修改原有字符串的值。
你无法像修改数组元素一样通过索引修改字符串的内容:
const s = 'hello' s[0] = 'H' // 操作无效,不会修改原字符串 console.log(s) // 仍然输出'hello'
为了优化内存占用,JS引擎会让内容完全相同的字符串指向常量池中的同一个内存位置,但因为字符串本身不可变,你永远不可能通过一个字符串变量的操作影响到其他同内容的字符串,根本不需要通过获取内存地址来理解它的特性,只要记住「原始类型按值比较、引用类型按引用比较,字符串是不可变原始值」这个规则就足够了。
内容的提问来源于stack exchange,提问作者lucky
相关产品推荐
相关产品推荐

