Object.assign对多层嵌套对象只做浅拷贝,因其仅复制第一层属性值:基本类型独立,引用类型共享内存地址;它不递归处理嵌套对象,设计目标是轻量级属性合并而非深度克隆。

Object.assign 在多层嵌套对象中只做浅拷贝,根本原因在于它不递归处理引用类型值——它只复制第一层属性的“值”,而对对象、数组这类引用类型,复制的只是内存地址,不是数据本身。
它只遍历第一层属性
Object.assign 会逐个读取源对象自身的可枚举属性(不包括原型链、不可枚举属性、Symbol 属性在某些旧环境可能受限),然后把属性名和对应值直接赋给目标对象。这个过程是“平铺式”的:
- 如果某个属性值是字符串、数字、布尔值等基本类型,就复制一份新值,彼此独立;
- 如果某个属性值是对象、数组、函数或正则等引用类型,就只把它的内存地址复制过去,新旧对象仍指向堆中同一块数据。
嵌套对象共享堆内存地址
比如 { user: { name: "张三", profile: { age: 28 } } },Object.assign 复制后:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
-
user这个属性被复制了,但它的值是一个地址; -
user.profile没有被单独拿出来处理,它仍是原对象里那个profile对象的地址; - 所以修改
copy.user.profile.age = 30,原对象的user.profile.age也会变成 30。
它没有内置递归逻辑
Object.assign 的设计目标是对象合并与简单赋值,不是深度克隆。它不会判断某个属性值是不是对象、要不要继续往下拷贝。这种“一层到底、不进深层”的行为是明确且有意的:
立即学习“Java免费学习笔记(深入)”;
- 性能更轻量:避免遍历整个嵌套结构;
- 语义更清晰:符合“属性级赋值”的直觉;
- 留出扩展空间:需要深拷贝时,开发者可选用
structuredClone、递归函数或第三方库,各取所需。
验证方式很简单
写一段小代码就能确认:
const original = { a: 1, nested: { b: 2 } };const copy = Object.assign({}, original);
copy.nested.b = 99;
console.log(original.nested.b); // 输出 99 —— 原对象被改了

















