object.assign 避免修改原始配置的关键是将空对象作为第一个参数,实现浅拷贝;对嵌套对象需用 structuredclone、json 序列化或手动展开处理;推荐使用展开运算符 {...obj} 或封装 mergeconfig 函数提升安全性和复用性。

用 Object.assign 避免修改原始配置数据,核心是**不直接操作原对象,而是创建一个新对象作为目标参数**。只要目标对象是空对象({})或全新对象,就不会污染原始数据。
确保第一个参数是空对象或新对象
Object.assign 的第一个参数是“目标对象”,它会被后续源对象的属性覆盖并返回。如果传入原始配置对象本身,它就会被直接修改。
✅ 正确写法(安全):
const originalConfig = { theme: 'dark', fontSize: 14 };
const newConfig = Object.assign({}, originalConfig, { fontSize: 16 }); // 返回新对象
console.log(originalConfig.fontSize); // 仍是 14,未被修改
console.log(newConfig.fontSize); // 16
❌ 错误写法(危险):
Object.assign(originalConfig, { fontSize: 16 }); // 直接改了 originalConfig!
注意:Object.assign 只是浅拷贝
如果原始配置中包含嵌套对象(如 { api: { timeout: 5000 } }),Object.assign 不会深复制这些嵌套层。修改新对象里的嵌套属性,仍可能影响原始对象。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 例如:
newConfig.api.timeout = 8000→originalConfig.api.timeout也会变成 8000 - 解决方法:对深层嵌套配置,改用结构化克隆(
structuredClone,现代浏览器支持)或 JSON 序列化反序列化(仅限纯数据) - 简单替代:手动覆盖整个嵌套对象,如
{ api: { ...originalConfig.api, timeout: 8000 } }
搭配解构赋值更清晰(推荐)
现代写法中,常用对象展开运算符({...obj})替代 Object.assign,语义更直观、不易出错:
const newConfig = { ...originalConfig, fontSize: 16 };
它本质等价于 Object.assign({}, originalConfig, { fontSize: 16 }),但更简洁,且天然避免误传目标对象的风险。
函数封装提升复用性
如果项目中频繁需要合并配置,可封装一个不可变更新工具函数:
const mergeConfig = (base, overrides) => ({ ...base, ...overrides });
// 或兼容旧环境:
// const mergeConfig = (base, overrides) => Object.assign({}, base, overrides);
const config = mergeConfig(originalConfig, { language: 'zh-CN' });
这样既保证每次调用都生成新对象,又统一了配置合并逻辑,降低出错概率。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










