Object.assign仅执行浅拷贝,不递归合并嵌套对象,同名嵌套属性会被整体替换而非字段叠加;引用类型仅复制地址,修改共享引用会影响原对象;undefined/null值会写入目标对象(null源被忽略);深度合并需借助structuredClone、lodash.merge或手写递归函数。

Object.assign 在合并对象时**不处理深度属性**,它只做一层浅拷贝——嵌套对象不会被递归合并,而是整个引用被替换。
嵌套对象会被整体覆盖,不是合并
如果多个源对象都有同名的嵌套对象属性(比如 api 或 user.profile),后出现的源对象会直接替换前一个,内部字段不会叠加。
- 例如:
{ api: { baseUrl: '/v1' } }和{ api: { timeout: 3000 } }合并后,结果是{ api: { timeout: 3000 } },baseUrl丢失 - 这不是“合并子属性”,而是“赋值整个对象引用”
所有引用类型都按地址复制
数组、日期、正则、普通对象等,只要出现在属性值位置,就只复制其内存地址,不创建副本。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
-
const a = { list: [1, 2] }; const b = Object.assign({}, a); b.list.push(3);→a.list也变成[1, 2, 3] - 深层嵌套如
user.address.city的修改,会影响所有共享该引用的对象
没有自动跳过 undefined 或 null 值
如果某个源对象里某属性值是 undefined,它仍会写入目标对象,把对应字段设为 undefined;null 同理,但 null 作为整个源对象参数会被跳过。
立即学习“Java免费学习笔记(深入)”;
-
Object.assign({x: 1}, {x: undefined})→{x: undefined} -
Object.assign({x: 1}, null, {y: 2})→{x: 1, y: 2}(null源被忽略)
想实现深度合并?得另想办法
Object.assign 本身不提供深合并能力。需要时可:
- 用
structuredClone()(现代环境)先深克隆再合并 - 借助
lodash.merge(),它会递归合并嵌套结构 - 手写递归函数,控制合并逻辑(如跳过
undefined、保留默认值等)

















