推荐使用 object.assign({}, defaults, userconfig) 实现安全的浅合并,默认值兜底、用户配置优先;注意其不支持嵌套深合并,需用 structuredclone+递归或 lodash.merge;解构默认参数更简洁,展开运算符是现代替代方案。

直接用 Object.assign() 把默认配置和用户传入的配置合并,后者会覆盖前者同名属性,实现“有则覆盖、无则保留”的默认值逻辑。
基本用法:用默认值兜底
把空对象作为目标,先放默认配置,再放用户配置。这样能避免修改原始默认对象,也确保用户配置优先:
-
Object.assign({}, defaults, userConfig)—— 安全可靠,推荐写法 - 不要写
Object.assign(defaults, userConfig),否则会污染 defaults 对象 - 如果 userConfig 是
null或undefined,可提前过滤,避免报错
处理嵌套对象时的注意事项
Object.assign() 是浅拷贝,对嵌套对象(比如 defaults.api.timeout)不会递归合并:
- 若用户只改了
api.baseUrl,但没提api.timeout,那timeout仍来自 defaults - 但如果用户传了整个
api: { baseUrl: '...' },那整个api对象会被替换,原来timeout就丢了 - 需要深合并时,得用
structuredClone+ 递归,或第三方库如 lodash 的merge
配合解构与默认参数更简洁
函数参数可以直接结合解构默认值,语义更清晰,也自动跳过 undefined:
function init({ timeout = 5000, retry = 3, ...rest } = {}) { ... }- 这种写法适合简单配置,且不依赖
Object.assign,代码更轻量 - 但无法动态控制哪些字段必须保留 defaults,灵活性略低于显式 assign
兼容性与现代替代方案
Object.assign 支持所有主流浏览器(IE9+),但 ES2018 起推荐用展开运算符:
-
{ ...defaults, ...userConfig }效果相同,更简洁,且天然忽略null/undefined - 注意:展开运算符同样只做浅合并,嵌套逻辑一致
- 如果需兼容老环境(如 IE),仍用
Object.assign
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











