Web Storage 和 dataset 只支持字符串,存对象或数组需用 JSON.stringify() 序列化,读取时用 JSON.parse() 还原,并加默认值和 try...catch 防错;Date、Map、Set、RegExp 等需手动转换,推荐用 replacer/reviver 统一处理。

Web Storage 只认字符串,存对象或数组必须先转成 JSON 字符串,读取时再还原——这是硬性规则,绕不开。
基础操作:存数组和普通对象
只要数据里不含函数、Date、undefined、RegExp 或循环引用,直接用 JSON.stringify() 和 JSON.parse() 就够用:
- 存:
localStorage.setItem('cart', JSON.stringify([{id: 1, qty: 2}, {id: 3, qty: 1}])) - 读:
const cart = JSON.parse(localStorage.getItem('cart') || '[]');——加|| '[]'防 null 报错 - 建议始终用
try...catch包裹JSON.parse(),避免非法字符串导致脚本中断
处理 Date、Map、Set 等特殊类型
原生 JSON 不认识这些类型,存进去会丢或变样。得手动“翻译”:
- Date 存前转 ISO 字符串:
date.toISOString();读取后用new Date(str)还原 - Map 存前转对象:
Object.fromEntries(map);读取后用new Map(Object.entries(obj.mapData)) - Set 存前转数组:
Array.from(set);读取后用new Set(parsedArray) - 正则表达式存
reg.toString()(如/abc/g),读取后new RegExp(str)
用 replacer 和 reviver 统一处理
避免每次手动转换,写一个通用的序列化/反序列化逻辑:
- 存时传入
replacer函数,自动识别并转换 Date、RegExp、Map、Set - 读时传入
reviver函数,在JSON.parse()过程中即时还原类型 - 例如检测 ISO 时间格式字符串,就当场 new Date;看到
"/^a/"类结构,就重建 RegExp
dataset 和其他 DOM 属性也得走 JSON 流程
dataset 看似能存对象,其实只是字符串容器:
- 写入前必须
el.dataset.config = JSON.stringify({theme: 'dark', count: 5}) - 读取后必须
JSON.parse(el.dataset.config || '{}') - 注意命名转换:data-user-id →
dataset.userId,中划线自动转驼峰 - 适合存轻量配置,别塞深层嵌套或大体积数据


















