localstorage不支持深度合并,需先json.parse读取、用_.merge深度合并、再json.stringify存回;注意处理null和解析异常,并避免高频/竞态写入。

LocalStorage 本身只支持字符串键值对,不能直接“深度合并”——它没有内置的合并逻辑。真正需要做的是:先读取原有数据、解析成对象、用深度合并策略更新、再序列化存回去。
必须先解析再操作
localStorage 只存字符串,所以任何对象都得先 JSON.parse() 才能处理。比如你存了:
localStorage.setItem('config', JSON.stringify({ user: { theme: 'light', lang: 'zh' }, app: { autoSave: true } }))
想只更新 user.lang 为 'en',就不能直接改字符串,而要:
- 用
getItem('config')拿出字符串 -
JSON.parse()转成对象 - 对这个对象执行深度合并(比如用
_.merge) -
JSON.stringify()后再setItem
推荐用 Lodash 的 _.merge
原生 JS 没有安全可靠的深合并方法,Object.assign 和展开运算符都只浅层覆盖。例如:
const old = { user: { theme: 'light' }, app: { autoSave: true } };
const update = { user: { lang: 'en' } };
const bad = { ...old, ...update }; // user 被整个替换,theme 丢失
用 _.merge 就能保留原有结构:
- 引入 Lodash(CDN 或 npm)
const merged = _.merge(JSON.parse(localStorage.getItem('config') || '{}'), update);localStorage.setItem('config', JSON.stringify(merged));
注意空值和异常处理
实际使用中常遇到 getItem 返回 null,或 JSON 解析失败。稳妥写法是:
- 默认提供空对象:
JSON.parse(localStorage.getItem('key') || '{}') - 加
try/catch包裹JSON.parse,防止损坏数据导致崩溃 - 合并后检查结果是否合理(比如是否仍是普通对象),再存入
避免频繁读写和竞态问题
localStorage 是同步阻塞 API,高频更新会卡 UI;多标签页同时写还可能覆盖。建议:
- 合并前加简单版本号或时间戳字段,用于判断是否需跳过旧写入
- 复杂场景改用 IndexedDB,或封装带防抖/队列的 localStorage 工具函数
- 跨窗口更新时监听
storage事件,实现状态同步而非重复写入
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











