object.assign 采用后覆盖前的浅合并策略:同名属性整值替换,不递归合并嵌套对象;多个源对象按从左到右顺序应用,后者的同名属性覆盖前者;如需深度合并,需借助 _.merge() 等替代方案。

ES6 中对象合并时,相同属性名会按“后写覆盖前写”的规则处理,也就是后面的值直接替换前面的值,不会做任何合并或递归处理。
Object.assign 的覆盖逻辑
使用 Object.assign(target, source1, source2) 时:
- 如果 source1 和 source2 都有同名属性(如
c),source2 的值会覆盖 source1 的 - 如果 target 和任意 source 有同名属性,source 的值会覆盖 target 的
- 覆盖是“整属性替换”,不是“深层合并”——比如两个对象都有
a: { x: 1 },后面对象的a会整个替换掉前面的a,而不是只更新x
嵌套对象不会自动深度合并
这是最容易踩坑的地方:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
target = { user: { name: 'Alice', age: 25 } }source = { user: { city: 'Beijing' } }-
Object.assign(target, source)结果是:{ user: { city: 'Beijing' } } - 原来的
name和age全部丢失,因为user属性被整个替换了
多个源对象的合并顺序很重要
参数从左到右依次应用,越靠后的优先级越高:
Object.assign({}, {a: 1, b: 2}, {b: 3, c: 4}, {c: 5, d: 6})- 结果:
{a: 1, b: 3, c: 5, d: 6} - 你可以把它理解为“链式覆盖”:每一步都用新对象的属性去更新当前结果
需要深度合并怎么办
原生 Object.assign 不支持,但有替代方案:
- 手动递归合并(适合简单场景)
- 使用工具库,如 Lodash 的
_.merge()(会递归合并嵌套对象) - 用扩展运算符 + 自定义逻辑,例如:
{ ...obj1, ...obj2 }行为与assign一致,也是浅层覆盖










