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

JavaScript中Object.assign()对象拷贝与引用传递问题咨询

Object.assign() 的引用传递与浅拷贝原理

Object.assign() 本质是浅拷贝,这就是你看到两种不同表现的核心原因,具体可以拆成两种场景理解:

1. 修改顶层属性不影响原对象的情况

当你修改拷贝对象的顶层属性时,如果是给属性重新赋值(不管是原始类型还是新的对象),原对象不会受影响,因为顶层属性的拷贝规则分两种:

  • 若顶层属性是原始类型(字符串、数字、布尔等),Object.assign() 直接拷贝它的具体值,拷贝对象和原对象的该属性各自独立。
  • 若顶层属性是引用类型(对象/数组),Object.assign() 拷贝的是引用地址,但如果你给拷贝对象的该属性重新赋值一个新对象,相当于切断了和原对象引用的关联,原对象的属性不会变化。

示例代码:

// 原始类型顶层属性
const original1 = { name: "Alice", age: 25 };
const copy1 = Object.assign({}, original1);
copy1.name = "Bob";
console.log(original1.name); // 输出 "Alice",不受影响

// 引用类型顶层属性重新赋值
const original2 = { info: { age: 25 } };
const copy2 = Object.assign({}, original2);
copy2.info = { age: 30 }; // 给copy2的info赋值新对象
console.log(original2.info.age); // 输出 25,原对象不受影响

2. 修改嵌套对象属性同时影响原对象和拷贝对象的情况

当源对象的属性是嵌套对象时,Object.assign() 只会拷贝这个嵌套对象的引用地址——也就是说,拷贝对象的嵌套属性和原对象的嵌套属性指向内存中同一个对象。这时修改这个共享对象的内部属性,两个对象都会体现出变化,因为它们本质上操作的是同一个东西。

示例代码:

const original = { info: { age: 25 } };
const copy = Object.assign({}, original);

copy.info.age = 30; // 修改共享嵌套对象的内部属性
console.log(original.info.age); // 输出 30,原对象被修改

核心原理总结

  • 浅拷贝只拷贝对象的第一层属性:
    • 第一层是原始类型:拷贝值,两者独立。
    • 第一层是引用类型:拷贝引用地址,共享底层对象,修改底层对象的内部属性会同步影响原对象和拷贝对象;但给拷贝对象的第一层引用属性重新赋值新对象,则不会影响原对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 18:48:38