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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:42:11