JavaScript 中 Object.assign 合并对象时的深度属性行为

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

Object.assign 在合并对象时**不处理深度属性**,它只做一层浅拷贝——嵌套对象不会被递归合并,而是整个引用被替换。

嵌套对象会被整体覆盖,不是合并

如果多个源对象都有同名的嵌套对象属性(比如 apiuser.profile),后出现的源对象会直接替换前一个,内部字段不会叠加。

  • 例如:{ api: { baseUrl: '/v1' } }{ api: { timeout: 3000 } } 合并后,结果是 { api: { timeout: 3000 } }baseUrl 丢失
  • 这不是“合并子属性”,而是“赋值整个对象引用”

所有引用类型都按地址复制

数组、日期、正则、普通对象等,只要出现在属性值位置,就只复制其内存地址,不创建副本。

  • 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,它仍会写入目标对象,把对应字段设为 undefinednull 同理,但 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、保留默认值等)

相关文章

精彩推荐