localstorage存取必须手动json序列化与反序列化,否则类型塌陷;安全get需判空+try/catch解析;健壮set须捕获quotaexceedederror;建议加前缀并处理date等不可序列化类型。

LocalStorage本身只认字符串,存对象、数组、布尔或 null 都会出问题——不是报错,而是悄悄变形或失效。真正可靠的封装,核心就两件事:严格走 JSON 流程 + 主动兜住各种异常。
为什么必须手动序列化和反序列化
localStorage.setItem() 会自动调用 value.toString()。对象变成 "[object Object]",undefined 变成 "undefined",null 变成 "null",数字和布尔虽能转对,但取出来全是字符串类型,没法直接当布尔或数字用。JSON.stringify 和 JSON.parse 不是“锦上添花”,是绕过类型塌陷的唯一通路。
安全 get:先判空,再尝试解析,失败就原样返回
直接 JSON.parse(localStorage.getItem(key)) 很危险——key 不存在时返回 null,JSON.parse(null) 报错;存的是纯字符串(如 token、theme)时,JSON.parse("dark") 也报错。稳妥写法是:
一款AI工具,主要用于使用 Codex CLI 进行深度网络搜索,适用于需要多源综合分析的复杂查询。当 `web_search`(Brave)返回结果不足,或用户……时使用,适合需要提升相关任务效率的用户。
- 读出原始值,为 null 或 undefined 就直接返回默认值
- 否则 try/catch 包裹 JSON.parse,解析失败就退回原始字符串
- 不强行统一转 JSON,兼容真实业务中混存多种类型的情况
健壮 set:序列化前校验,写入后捕获 QuotaExceededError
iOS Safari 隐私模式下 localStorage 写入必然失败,且无法提前预判(length 始终为 0)。所以:
- 必须用 try/catch 包裹 localStorage.setItem
- 捕获到 QuotaExceededError 不能静默吞掉,要明确返回 false 或抛出自定义错误
- 不自动 fallback 到 sessionStorage 或内存缓存——生命周期不同,容易引发状态错乱
加前缀与类型兼容性处理
多人协作或多个应用共存时,key 冲突很常见。建议统一加项目前缀(如 "myapp_"),避免覆盖他人数据。另外,JSON 对 Date、RegExp、Map 等原生类型不友好:
- Date 存成时间戳 number 或 ISO 字符串,读出后手动 new Date()
- 函数、Symbol、undefined 字段在 JSON.stringify 中被忽略,存之前应清洗或转为可序列化结构
- 循环引用对象需提前检测,避免 TypeError










