object.assign 是 javascript 中用于浅拷贝和对象合并的内置方法,将多个源对象的可枚举自身属性按序复制到目标对象并返回该目标对象;它会修改原目标对象、不处理原型链和 symbol 属性(除非显式指定)、仅浅拷贝嵌套引用,常用于配置合并,但无法深合并,替代方案包括 _.merge()、structuredclone() 或展开运算符。

Object.assign 是 JavaScript 中用于浅拷贝和对象合并的内置方法,它会将一个或多个源对象的所有可枚举自身属性复制到目标对象,并返回目标对象。
基本用法:合并多个源对象
语法为 Object.assign(target, ...sources)。第一个参数是目标对象(会被修改并返回),后续所有参数都是源对象,按顺序从左到右依次拷贝属性。如果属性名重复,后出现的源对象会覆盖前面的值。
- 目标对象会被直接修改,不是创建新对象(除非传入空对象作为 target)
- 只拷贝可枚举的自身属性(不处理原型链上的属性、Symbol 属性需显式指定)
- 属于浅拷贝:嵌套对象的引用会被复制,不会递归合并
常见合并场景示例
比如配置默认值、合并用户输入与默认设置:
const defaults = { theme: 'light', fontSize: 14 };const userOptions = { theme: 'dark' };
const config = Object.assign({}, defaults, userOptions);
// 结果:{ theme: 'dark', fontSize: 14 }
注意:使用空对象 {} 作为第一个参数,可避免污染原始对象。
合并多个对象及注意事项
可以传入任意数量的源对象,包括 null 或 undefined(会被跳过):
const a = { x: 1 };const b = { y: 2 };
const c = { z: 3 };
Object.assign({}, a, b, c); // { x: 1, y: 2, z: 3 }
但要注意:
- 原始类型(如数字、字符串)会被自动包装成对象再读取属性(通常结果为空)
- null 和 undefined 不能作为 target,否则报错;但可作为 source(被忽略)
- 无法处理深合并,例如
{ user: { name: 'A' } }和{ user: { age: 25 } }合并后,user 会被整体替换,不是 { name: 'A', age: 25 }
替代方案提示
若需深合并、过滤属性、处理数组或 Symbol 键,建议使用 Lodash 的 _.merge()、structuredClone()(现代环境深拷贝)、或手动实现递归合并逻辑。ES6+ 中也可结合展开运算符({...a, ...b})实现简单浅合并,但不支持动态数量的源对象或错误处理。










