Object.assign() 是 JavaScript 中用于浅拷贝和对象合并的内置方法,将多个源对象的可枚举自有属性复制到目标对象,返回该目标对象;它不处理原型属性、不可枚举属性或深嵌套属性,仅执行浅层覆盖合并。

Object.assign() 是 JavaScript 中用于浅拷贝和合并对象的内置方法,常被用来实现配置对象(config)的默认值与用户自定义选项的合并。
基本用法:合并多个配置对象
它接收一个目标对象作为第一个参数,后续所有对象作为源对象,将它们的可枚举自有属性依次复制到目标对象上,并返回该目标对象。
- 目标对象会被修改(即“原地合并”),若不希望污染原始对象,应传入空对象作为第一个参数
- 属性赋值按参数顺序覆盖:后出现的对象中同名属性会覆盖前面的值
- 只处理对象自身的、可枚举的属性,不复制原型链上的属性或不可枚举属性(如
constructor、toString)
典型配置合并模式
常见于函数参数处理,例如封装一个带默认配置的工具函数:
function initOptions(userOptions) {
const defaults = {
timeout: 5000,
retry: 3,
method: 'GET',
headers: { 'Content-Type': 'application/json' }
};
return Object.assign({}, defaults, userOptions);
}
// 使用示例
const config = initOptions({ timeout: 3000, retry: 1 });
// 结果:{ timeout: 3000, retry: 1, method: 'GET', headers: { 'Content-Type': 'application/json' } }
注意:headers 这类嵌套对象仍是浅拷贝——如果 userOptions.headers 存在,它会完全替换 defaults.headers,而不是深度合并。
立即学习“Java免费学习笔记(深入)”;
注意事项与常见陷阱
-
不支持深合并:嵌套对象不会递归合并,仅替换整个引用。如需深度合并,需借助 Lodash 的
merge()或手写递归逻辑 - null 或 undefined 源对象会被跳过,不会报错,但也不会产生任何效果
- Symbol 属性会被复制(ES2015+),只要它是可枚举的
- 在旧环境(如 IE)中需引入 polyfill,或改用 Babel 转译
替代方案提示
现代开发中,也可使用展开运算符({...defaults, ...userOptions})实现相同效果,语法更简洁,语义更清晰,且同样为浅合并。两者行为一致,选择取决于代码风格和兼容性要求。


















