JS中给引用变量重新赋值未修改原对象属性的原因是什么?
JavaScript引用类型赋值与属性修改原理
首先明确JavaScript中两种赋值操作的本质差异:
- 基本类型(数值、字符串、布尔值等)的变量存储的是值本身
- 引用类型(对象、数组、函数等)的变量存储的是指向堆内存中实际对象的引用地址,不是对象本身
第一种写法不生效的原因
你的代码中执行的两步操作:
cr = obj.next; cr = 6;
- 执行
cr = obj.next时:obj.next存储的是嵌套对象{val:2, next: {...}}的引用地址,这一步是把该地址复制给变量cr,此时cr和obj.next指向堆内存中的同一个对象,但cr是完全独立的变量,不是obj.next的别名。 - 执行
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
相关产品推荐
相关产品推荐

