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

JS中给引用变量重新赋值未修改原对象属性的原因是什么?

JavaScript引用类型赋值与属性修改原理

首先明确JavaScript中两种赋值操作的本质差异:

  • 基本类型(数值、字符串、布尔值等)的变量存储的是值本身
  • 引用类型(对象、数组、函数等)的变量存储的是指向堆内存中实际对象的引用地址,不是对象本身

第一种写法不生效的原因

你的代码中执行的两步操作:

cr = obj.next;
cr = 6;
  1. 执行cr = obj.next时:obj.next存储的是嵌套对象{val:2, next: {...}}的引用地址,这一步是把该地址复制给变量cr,此时cr和obj.next指向堆内存中的同一个对象,但cr是完全独立的变量,不是obj.next的别名。
  2. 执行cr = 6时:这是直接给cr变量本身重新赋值,把它原来存储的对象引用地址覆盖为基本类型数值6,整个过程没有修改obj的任何属性,obj.next的指向没有发生任何变化,所以打印的obj和初始状态一致。

第二种写法生效的原因

如果你改为cr.next = 6,操作逻辑发生了变化:
你没有给cr变量本身重新赋值,而是通过cr存储的引用地址,找到它指向的堆内存中的实际对象,修改该对象的next属性。因为这个对象就是obj.next指向的对象,所以修改会同步反映到obj上,原对象属性自然更新。

实现你期望效果的写法

如果要把obj.next直接修改为6,不需要中间变量,直接操作原对象属性即可:

obj.next = 6;

如果一定要通过中间变量实现,需要让中间变量指向obj本身,再修改它的next属性:

let cr = obj;
cr.next = 6;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:54:05