You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript对象赋值更新行为疑问:为何修改a会影响b?

为什么修改对象a的属性会同步影响b?

这完全是JavaScript引用类型的正常机制,咱们一步步拆解你的代码和背后的逻辑:

首先看你代码里最关键的那一行:

var a = b = {name: 'Hai'};

你提到赋值是从右到左的,这点没错,但这里还有个容易忽略的细节:b没有用var声明,所以它会变成全局变量(严格模式下会直接报错)。不过核心问题不在这个,而是赋值后a和b的关系:

  • 第一步:创建了一个新的对象{name: 'Hai'},这个对象实际存储在堆内存中
  • 第二步:把这个对象的引用地址赋值给b
  • 第三步:把b的值(也就是同一个对象的引用地址)赋值给a

简单说,a和b就像两个不同的门牌号,但它们指向的是同一个物理房子(堆里的那个对象)。

接下来对应你的执行输出一步步看:

  1. 初始时,a.name和b.name都是访问同一个“房子”里的name属性,所以输出Hai Hai
  2. 当你执行a.name = 'Hello'时,并不是修改a变量本身,而是通过a的引用找到对应的对象,把对象内部的name属性改成了Hello
  3. 这时候b依然指向同一个对象,所以b.name自然也变成了Hello,输出Hello Hello

如果想让a和b各自独立,修改其中一个不影响另一个,你需要让它们指向不同的对象,比如:

// 方式1:分别创建独立对象
var a = {name: 'Hai'};
var b = {name: 'Hai'};

// 方式2:浅拷贝对象
var a = {name: 'Hai'};
var b = {...a}; // 或者使用 Object.assign({}, a)

这样a和b就指向两个完全独立的“房子”,修改其中一个的属性就不会影响另一个了。

内容的提问来源于stack exchange,提问作者Dhanapal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 02:29:29