Object.assign仅执行浅拷贝,不递归合并嵌套对象,同名嵌套属性会被整体替换而非字段叠加;引用类型仅复制地址,修改共享引用会影响原对象;undefined/null值会写入目标对象(null源被忽略);深度合并需借助structuredClone、lodash.merge或手写递归函数。
Object.assign 在合并对象时**不处理深度属性**,它只做一层浅拷贝——嵌套对象不会被递归合并,而是整个引用被替换。
如果多个源对象都有同名的嵌套对象属性(比如 api 或 user.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,它仍会写入目标对象,把对应字段设为 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、保留默认值等)