json数据须序列化为字符串才能存入localstorage/sessionstorage;安全存取需校验序列化、try-catch存储、验证字符串后再解析,并手动处理date、regexp等特殊类型及隐私模式降级。

JSON 数据本身不能直接存进本地缓存,必须先转成字符串;localStorage 和 sessionStorage 只认字符串,存对象或数组不序列化就会变成 "[object Object]",取出来完全不可用。安全存取的核心是:**序列化前校验、存储时兜底、解析时防错、特殊类型手动处理**。
存之前:确保能被 JSON 安全序列化
JSON.stringify() 会跳过函数、undefined、Symbol,遇到循环引用直接报错,Date 和 RegExp 会被转成无效格式。所以不能无脑传入原始数据。
- 避免传入含函数、DOM 节点、Map/Set 或自定义类实例的对象
- 把 Date 转成时间戳
date.getTime()或 ISO 字符串date.toISOString() - 正则建议存为对象:
{ source: 'abc', flags: 'g' },读取时用new RegExp(obj.source, obj.flags) - 对可能为
null或undefined的值提前设默认值,比如data ?? {}
存的时候:加 try-catch,别让失败静默
即使数据看起来没问题,也可能因浏览器限制(如隐私模式禁用、配额超限)导致 setItem 失败,不捕获就等于丢数据。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 用
try { localStorage.setItem(key, JSON.stringify(data)) } catch (e) { /* 记录或降级 */ } - 不要依赖
localStorage.length判断是否写入成功——它只反映键数量,不反映写入状态 - 大体积数据(比如 >1MB)建议分块或改用 IndexedDB,避免阻塞主线程
取的时候:永远检查字符串有效性再解析
getItem() 返回 null(没存过)或字符串,但 JSON.parse(null) 得到 null,JSON.parse('') 直接报错。不判断就调 parse 是常见崩溃点。
- 先判断返回值是否为非空字符串:
const str = localStorage.getItem(key); if (!str) return defaultValue; - 用
try/catch包裹JSON.parse(),解析失败时返回合理默认值(如[]或{}) - 不要用
typeof === 'object'判断结果是否有效——null也是'object'
额外注意:生命周期和环境边界
localStorage 没有过期机制,也不加密,且在 Safari 无痕模式下会静默失效。这些不是代码问题,但会导致“明明写了却读不到”。
- 敏感字段(如 token、用户身份)不要单独存在 localStorage,至少配合内存缓存 + 服务端校验
- 隐私模式下可加降级策略:
try { localStorage.setItem(...) } catch { useInMemoryCache(...) } - 需要自动过期?自己存时间戳字段,读取时比对:
if (now - savedAt > 24 * 60 * 60 * 1000) { removeItem(...) }
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










