JavaScript浅/深拷贝困惑:两类赋值操作结果差异原因咨询
理解JS引用类型:变量赋值与对象属性修改的差异
核心原因:JS引用类型的工作机制
JS里的对象(包括数组)属于引用类型,变量存储的不是对象本身,而是指向对象在内存中地址的引用。这是两个示例行为不同的根本原因。
示例1分析:变量重新赋值不影响已有引用
let person = {name : "Lydia"}; const members = [person]; person = null; console.log(members); // 输出: [{name: "Lydia"}]
- 第一步:
person变量存储了指向{name: "Lydia"}对象的内存引用。 - 第二步:把
person的引用存入members数组,此时数组的第一个元素和person指向同一个内存地址的对象。 - 第三步:
person = null是给person变量重新赋值,让它指向null,不再关联原来的对象。但members数组里保存的原引用并没有改变,依然指向最初的{name: "Lydia"}对象,所以输出不受影响。
示例2分析:修改引用对象的属性会同步到所有指向它的引用
let person = {name : "Lydia"}; const members = [person]; person.name = null; console.log(members); // 输出: [{name: null}]
- 前两步和示例1一致,
person和members[0]指向同一个对象。 - 第三步:
person.name = null不是修改person变量的引用,而是通过这个引用直接修改了内存中对象的属性。因为members[0]和person指向同一个对象,所以数组里的对象也会同步显示这个修改结果。
额外示例强化理解
示例3:多个变量指向同一对象的属性修改
let a = {count: 1}; let b = a; b.count = 2; console.log(a.count); // 输出: 2 // a和b指向同一个对象,修改b的属性会直接影响a
示例4:重新赋值变量不影响其他引用
let x = {value: 10}; let y = x; x = {value: 20}; console.log(y.value); // 输出: 10 // x被重新赋值为新对象,y依然指向原来的旧对象
关键总结
- 给引用类型变量重新赋值(比如
person = null或x = {新对象}):只是改变当前变量的指向,不会影响其他已经保存了原对象引用的变量、数组或对象。 - 通过引用修改对象属性(比如
person.name = null或b.count = 2):直接修改内存中的对象本身,所有指向该对象的引用都会同步看到变化。
内容的提问来源于stack exchange,提问作者Chirag Mittal
相关产品推荐
相关产品推荐

