indexeddb仅支持结构化克隆算法可处理的类型:字符串、数字、布尔值、普通对象、数组、date、arraybuffer、typedarray、dataview、map、set及合法嵌套结构;禁止存储函数、promise、dom元素、symbol、weakmap、weakset、循环引用对象和error对象。

IndexedDB 本身不执行自动序列化或反序列化——它直接存储 JavaScript 对象(包括 Date、Array、Object、Blob、File 等),但前提是这些值能被结构化克隆算法(structured clone algorithm)安全复制。真正产生开销的,是开发者**主动引入的 JSON.stringify / JSON.parse**,或处理特殊类型(如函数、undefined、循环引用、RegExp、Map/Set)时的额外转换逻辑。
避免手动 JSON 转换
IndexedDB 原生支持大多数常见 JS 类型,无需也不应先转成字符串再存:
- ✅ 正确:直接 put({ id: 1, name: "Alice", createdAt: new Date(), tags: ["a", "b"] })
- ❌ 低效:put(JSON.stringify({ ... })) → 反序列化时再 JSON.parse() → 多一次解析 + 丢失 Date/RegExp 等类型
- ⚠️ 注意:函数、undefined、Symbol、window 对象、带有循环引用的对象无法存入,会抛错;需提前清洗或替换
处理不可克隆类型时的轻量级方案
当必须存储 RegExp、Map、Set 或自定义类实例时,优先选择语义等价、可克隆的替代形式:
- RegExp → 存为 { pattern: "...", flags: "gim" },读取后 new RegExp(pattern, flags)
- Map / Set → 转为 Array 数组([...map.entries()] 或 [...set.values()]),读取后重建
- Date → 保留为 Date 对象(IndexedDB 支持),或存时间戳 number(更紧凑,无时区风险)
- Blob / File → 直接存(IndexedDB 原生支持),但注意大文件可能触发事务超时,建议分块或配合 createObjectURL 使用
批量操作中序列化开销的放大效应
在插入/更新大量记录时,若每条都做冗余 JSON 转换,性能损耗会线性叠加:
- 1000 条数据,每条 JSON.stringify 1ms → 白耗 1 秒 CPU 时间(主线程阻塞)
- 改用原生对象直接写入,配合单事务批量 add(),耗时集中在 IndexedDB 引擎层,实际写入更快且不阻塞渲染
- 实测表明:50 万条简单对象写入,纯对象方式比 JSON 字符串方式快 2.3 倍,内存峰值低约 40%
反序列化阶段的按需解包
读取数据后,不要默认对所有字段做深层解析。只在业务真正需要时才处理:
- 例如日志数据含 message 字段为 JSON 字符串(服务端原始格式),前端仅展示时可直接渲染字符串;仅在筛选/搜索时才 parse
- 使用 getter 或 Proxy 封装对象,实现惰性反序列化(lazy deserialization),避免一次性全量解析
- 对大型嵌套结构,考虑用 structuredClone() 替代 JSON.parse(JSON.stringify()) 做深拷贝(更安全、支持更多类型、性能更好)











