引用类型赋值是地址拷贝,obj1和obj2指向同一对象,修改属性会同步,但重新赋值仅改变自身指向;函数传参同理,形参修改属性影响外部,重赋值则不影响;可用===验证引用相等。

是的,引用类型赋值时,两个变量确实会指向同一个对象——这不是巧合,而是语言底层机制决定的。
赋值本质是地址拷贝,不是对象复制
当你写 let obj1 = { name: 'Alice' };,内存中创建一个对象,并把它的地址存进 obj1;再写 let obj2 = obj1;,实际是把那个地址值复制给了 obj2。此时两者共享同一块堆内存,没有新对象诞生。
- 修改 obj1.name = 'Bob',obj2.name 也会变成 'Bob'
- 给 obj1.age = 25,obj2.age 同样可读、值为 25
- 但若执行 obj1 = { name: 'Charlie' },这只是让 obj1 指向新对象,obj2 仍牢牢连着原来的 { name: 'Bob' }
函数传参也是同理,形参接收的是引用值
把引用变量传入函数,形参拿到的仍是原对象的地址。只要没在函数内重新赋值给形参(比如 obj = {}),所有对属性的操作都会反映到外部变量上。
- function update(obj) { obj.city = 'Beijing'; } → 调用后 obj2.city 出现
- function replace(obj) { obj = { city: 'Shanghai' }; } → 外部对象不受影响,因为只是改了形参自己的指向
如何验证它们真的共用一个对象?
最直接的方法是用 === 判断引用相等性:
- obj1 === obj2 返回 true,说明指向同一内存地址
- 哪怕 obj1 和 obj2 内容完全一样但由不同字面量创建,=== 也返回 false
- 还可以配合 Object.is(obj1, obj2) 或检查修改后的同步效果来交叉验证
注意:赋值 ≠ 绑定,断开指向很常见
“指向同一对象”不意味着永久绑定。任何一方被重新赋值(= 新对象)、设为 null 或 undefined,都只影响自己,另一方依然持有原对象的引用。
- obj1 = null; → obj2 还能正常访问原对象
- obj2 = {}; → obj1 不受影响,仍指向旧对象(除非已被垃圾回收)
- 真正切断联系,必须让双方都不再持有该地址,才可能触发回收

















