为什么如下JS代码中members输出{name: 'Linda'}?引用类型地址不是相同吗
你给出的代码执行逻辑可以逐行拆解:
let person = { name : 'Linda'}; let members = person; person = null console.log(members)
核心原理
你混淆了变量本身的重新赋值和修改引用指向的对象内容两种操作的区别:
- 执行
let person = { name : 'Linda'}时:JS在堆内存中创建{name: 'Linda'}对象,栈内存中的person变量存储该对象的堆内存地址。 - 执行
let members = person时:将person存储的地址值复制给members,此时两个变量指向同一个堆内存对象,符合引用类型的特性。 - 执行
person = null时:仅修改person变量本身存储的内容,让它从指向原对象改为指向null。这个操作既不会修改堆中的原对象,也不会改动members存储的地址值。 - 最终打印
members时,它仍然持有原对象的引用,所以输出{name: 'Linda'}。
容易混淆的场景对比:如果你执行的是
person.name = 'Alice'这种修改对象属性的操作,那么members.name也会同步变为Alice,因为两个变量指向同一个对象,修改对象本身的内容会影响所有持有该对象引用的变量。
内容的提问来源于stack exchange,提问作者Phucq.ins
相关产品推荐
相关产品推荐

