javascript中引用类型在内存中采用“堆存数据、栈存引用”方式:对象实体存于堆内存,变量仅在栈中保存指向该实体的地址;赋值时复制的是地址而非对象本身,故修改共享对象内容会影响所有引用它的变量。

JavaScript 中的引用数据类型(如对象、数组、函数等)在内存中存储和赋值的方式,核心在于“堆内存存储 + 栈中保存引用地址”。理解这点,就能明白为什么修改一个变量会影响另一个看似独立的变量。
对象实际存在堆内存中
当你创建一个对象(例如 let obj = { name: "Alice" }),JS 引擎会在**堆内存(heap)**中开辟一块空间,存放这个对象的具体内容(键值对、属性结构等)。而变量 obj 本身并不存对象数据,它只存一个指向该堆内存位置的**引用(reference)**,这个引用类似一个“地址编号”,保存在**栈内存(stack)**中。
赋值时复制的是引用,不是对象本身
执行 let obj2 = obj 时,JS 并不会把整个对象复制一份给 obj2。它只是把 obj 所持有的那个“地址”拷贝给了 obj2。结果就是:两个变量指向堆内存中的**同一个对象**。
-
obj.name = "Bob"→obj2.name也会变成"Bob" -
obj2.age = 30→obj.age同样可访问,值为30
重新赋值会切断原有引用关系
如果后续让某个变量指向新对象,比如 obj = { name: "Charlie" },这并不会影响 obj2。因为这次操作只是把 obj 的栈中引用改成了新地址,obj2 仍牢牢指向原来的堆内存位置。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
此时两个变量各自独立,互不干扰 —— 关键在于:**改变引用 ≠ 改变对象内容;改变对象内容 ≠ 改变引用**。
如何真正复制对象(浅拷贝与深拷贝)
若想让两个变量拥有各自独立的对象副本,必须显式拷贝:
-
浅拷贝:只复制第一层属性的值。对基本类型没问题;对嵌套对象/数组,内部仍共享引用。
常用方法:Object.assign({}, obj)、{...obj}、Array.from(arr)、arr.slice() -
深拷贝:递归复制所有层级,确保完全隔离。
可用JSON.parse(JSON.stringify(obj))(仅限纯数据,不支持函数、undefined、Date 等);更可靠用structuredClone()(现代浏览器支持)或第三方库如 Lodash 的_.cloneDeep()
本质上,JS 的引用赋值是轻量且高效的,但也正是这种机制带来了常见的“意外共享”问题。看清“栈存地址、堆存数据”这一分工,就抓住了理解对象行为的关键。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










