扩展运算符实现浅拷贝覆盖的核心是默认配置在前、用户配置在后,同名属性自动覆盖;但嵌套对象如headers会被整体替换,需显式合并或封装函数处理。

用扩展运算符(...)实现配置项的浅拷贝覆盖,核心是:先展开默认配置,再展开用户传入的配置对象,后者同名属性会自动覆盖前者。
基本写法:默认配置在前,自定义配置在后
这是最常用、最安全的方式:
const defaultConfig = {
timeout: 5000,
retry: 3,
headers: { 'Content-Type': 'application/json' }
};
const userConfig = {
timeout: 10000,
headers: { 'Authorization': 'Bearer xyz' }
};
const finalConfig = { ...defaultConfig, ...userConfig };
// 结果:
// {
// timeout: 10000,
// retry: 3,
// headers: { 'Authorization': 'Bearer xyz' }
// }
注意:headers 被完全替换了——这是浅拷贝的典型表现,嵌套对象不会合并,而是直接覆盖。
需要嵌套合并?得手动处理或换工具
扩展运算符只做一层浅合并。如果想让 headers 也合并(比如保留 Content-Type 并新增 Authorization),不能靠 ... 自动完成:
- ❌ 错误写法(仍会覆盖整个
headers):{ ...defaultConfig, ...userConfig, headers: { ...defaultConfig.headers, ...userConfig.headers } } - ✅ 正确写法(显式合并嵌套字段):
{ ...defaultConfig, ...userConfig, headers: { ...defaultConfig.headers, ...userConfig.headers } }—— 这行本身是对的,但必须单独为每个要深合的字段写一次 - ? 更清晰的做法是封装函数,对关键字段做条件合并
避免意外覆盖:冻结默认配置或使用 const
确保 defaultConfig 不被意外修改:
- 声明时用
const防止重新赋值 - 必要时用
Object.freeze(defaultConfig)冻结对象(防止属性被改写) - 不建议在合并前修改
defaultConfig,否则影响所有后续调用
函数参数中常用模式
封装配置函数时,推荐这样写:
function request(url, options = {}) {
const config = {
method: 'GET',
timeout: 5000,
...options // 用户配置覆盖默认值
};
// 后续逻辑
}
注意顺序:把固定默认值写在前面,...options 放最后,保证用户传的同名字段一定生效。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











