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

为何JavaScript中未直接修改对象,其属性值却发生了更新?

两种赋值表现差异的核心原因是JavaScript的数据类型存储机制不同

原始值类型(数字、字符串、布尔值等)的存储与赋值

  • 这类数据直接存储在栈内存中,赋值时会完整复制一份值给新变量,新旧变量各自对应栈内存里的独立空间,修改任意一个都不会影响另一个。

对应你的示例代码:

var a = 45;
var b = a;
b = 99;
console.log(a,b) // 输出45, 99

这里给b重新赋值相当于在栈内存里新开了一块空间存99,和a原本存储的45没有关联,所以a的值不会变。

引用类型(对象、数组、函数等)的存储与赋值

  • 这类数据的实际内容存储在堆内存中,栈内存里只保存指向堆内存地址的指针。你执行basket = obj操作时,只是把obj保存的堆内存地址复制给了basket,两个变量实际指向堆里的同一个对象。

所以不管通过哪个变量修改对象的属性,操作的都是堆内存里的同一个对象,自然另一个变量访问时也会拿到修改后的结果。
对应你的示例代码:

let obj = { apple: 12, mango: 13 };
basket = obj;
basket.apple = 45;
basket.banana = 15;
console.log(obj); // 输出 { apple: 45, mango: 13, banana: 15 }

如果你想要得到两个互不影响的独立对象,可以做对象拷贝:

  • 浅拷贝(只拷贝第一层属性,适合没有嵌套对象的场景):可以用const basket = {...obj}或者const basket = Object.assign({}, obj)
  • 深拷贝(拷贝所有层级的属性,适合有嵌套对象的场景):可以用JSON.parse(JSON.stringify(obj))或者自定义深拷贝方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 03:06:03