如何在Web Storage中存储和读取复杂数据类型?

简介: 如何在Web Storage中存储和读取复杂数据类型?

Web Storage 仅支持字符串类型的键值对存储,但实际开发中常需存储对象、数组等复杂数据类型。解决方法是通过 JSON 序列化与反序列化 实现复杂数据的转换,具体操作如下:

一、核心原理

  • 存储时:使用 JSON.stringify() 将复杂数据类型(对象、数组等)转换为字符串。
  • 读取时:使用 JSON.parse() 将字符串还原为原始的复杂数据类型。

这种方式适用于所有可被 JSON 表示的数据(对象、数组、字符串、数字、布尔值、null),但注意 JSON 不支持函数、正则、日期对象等特殊类型(需额外处理)。

二、具体实现示例

1. 存储和读取对象

// 定义一个复杂对象
const userInfo = {
   
  id: 1001,
  name: "鸿蒙用户",
  settings: {
   
    theme: "dark",
    notifications: true
  },
  hobbies: ["编程", "运动"]
};

// 1. 存储:将对象转为JSON字符串
localStorage.setItem('userInfo', JSON.stringify(userInfo));

// 2. 读取:将JSON字符串还原为对象
const savedUserInfo = localStorage.getItem('userInfo');
const parsedUserInfo = savedUserInfo ? JSON.parse(savedUserInfo) : {
   };

// 使用还原后的数据
console.log(parsedUserInfo.name); // 输出:"鸿蒙用户"
console.log(parsedUserInfo.settings.theme); // 输出:"dark"

2. 存储和读取数组

// 定义一个数组
const todos = [
  {
    id: 1, text: "学习Web Storage", done: false },
  {
    id: 2, text: "处理复杂数据", done: true }
];

// 1. 存储数组
localStorage.setItem('todos', JSON.stringify(todos));

// 2. 读取数组
const savedTodos = localStorage.getItem('todos');
const parsedTodos = savedTodos ? JSON.parse(savedTodos) : [];

// 使用数组
console.log(parsedTodos[0].text); // 输出:"学习Web Storage"

3. 处理特殊类型(如日期对象)

JSON 序列化会将 Date 对象转为字符串(如 "2024-07-23T08:00:00.000Z"),读取时需手动还原为 Date 对象:

// 包含日期对象的数据
const event = {
   
  title: "会议",
  time: new Date(2024, 6, 23) // 2024年7月23日
};

// 1. 存储
localStorage.setItem('event', JSON.stringify(event));

// 2. 读取并还原日期对象
const savedEvent = localStorage.getItem('event');
if (savedEvent) {
   
  const parsedEvent = JSON.parse(savedEvent);
  // 将字符串转为Date对象
  parsedEvent.time = new Date(parsedEvent.time);
  console.log(parsedEvent.time.getFullYear()); // 输出:2024
}

4. 批量操作复杂数据

对于多个复杂数据,可统一存储在一个对象中,减少键名数量:

// 批量存储多种数据
const appData = {
   
  user: {
    name: "张三", age: 25 },
  history: ["首页", "详情页"],
  config: {
    version: "1.0.0" }
};

// 存储
localStorage.setItem('appData', JSON.stringify(appData));

// 读取
const parsedData = JSON.parse(localStorage.getItem('appData') || '{}');
console.log(parsedData.user.name); // 输出:"张三"
console.log(parsedData.history[0]); // 输出:"首页"

三、注意事项

  1. 数据大小限制
    单个 localStorage 存储的总数据量建议不超过 5MB,复杂数据序列化后可能体积较大,需注意控制大小(如分页存储大量列表数据)。

  2. 不支持的类型
    JSON 不支持函数、正则表达式、undefinedSymbol 等类型,存储这些类型会导致数据丢失或异常:

    const invalidData = {
         
      func: () => {
         }, // 序列化后会丢失(变为null)
      reg: /test/,   // 序列化后变为空对象{}
      undef: undefined // 序列化后会被忽略
    };
    console.log(JSON.stringify(invalidData)); 
    // 输出:{"reg":{}}(函数和undefined丢失)
    
  3. 性能考量
    频繁序列化/反序列化大型复杂数据(如万级数组)会消耗性能,建议:

    • 只存储必要字段,避免冗余数据。
    • 高频访问的数据可缓存到内存中,减少 JSON.parse() 调用次数。
  4. 错误处理
    读取时需处理可能的 JSON 解析错误(如数据被篡改导致格式异常):

    try {
         
      const data = JSON.parse(localStorage.getItem('data') || '');
    } catch (error) {
         
      console.error('数据解析失败:', error);
      // 处理错误(如清空无效数据)
      localStorage.removeItem('data');
    }
    

总结

在 Web Storage 中存储复杂数据的核心是 JSON 序列化与反序列化,步骤简单且兼容性好。只需注意数据类型限制和大小控制,即可满足大多数场景的需求。对于包含特殊类型(如 Date)的数据,需在反序列化后手动还原类型,确保数据可用性。

相关文章
|
10月前
|
Ubuntu Linux Windows
IP地址查看方法
本指南介绍了在不同操作系统中查看设备IP地址的方法。在Windows系统中,可通过命令提示符(输入`ipconfig`)或设置界面查找IPv4地址;Linux系统中,使用终端命令`ifconfig`或`ip addr show`获取网络接口的IP;Mac系统则可在“系统偏好设置”中的“网络”查看,或通过终端执行相同命令获取。这些方法简单易行,适用于各种常见场景。
4113 11
|
存储 缓存 Linux
【Shell 命令集合 磁盘维护 】Linux 设置和查看硬盘驱动器参数 hdparm命令使用教程
【Shell 命令集合 磁盘维护 】Linux 设置和查看硬盘驱动器参数 hdparm命令使用教程
663 0
|
4月前
|
SQL JSON 分布式计算
【跨国数仓迁移最佳实践6】MaxCompute SQL语法及函数功能增强,10万条SQL转写顺利迁移
本系列文章将围绕东南亚头部科技集团的真实迁移历程展开,逐步拆解 BigQuery 迁移至 MaxCompute 过程中的关键挑战与技术创新。本篇为第六篇,MaxCompute SQL语法及函数功能增强。 注:客户背景为东南亚头部科技集团,文中用 GoTerra 表示。
429 20
|
6月前
|
存储 分布式计算 Linux
安装篇--CentOS 7 虚拟机安装
VMware 装 CentOS 7 不知道从哪下手?这篇超详细图文教程手把手教你在 VMware Workstation 中完成 CentOS 7 桌面系统的完整安装流程。从 ISO 镜像下载、虚拟机配置,到安装图形界面、设置用户密码,每一步都有截图讲解,适合零基础新手快速上手。装好之后无论你是要搭 Hadoop 集群,还是练 Linux ,这个环境都够你折腾一整天!
2329 3
|
5月前
|
人工智能 程序员
注意力隧道效应与 Burnout:专注的双刃剑
最让人投入的状态,也可能埋下倦怠的种子。对我们每个人而言,关键在于认识到 ‘心流不是一个可持续的常态,而是一个需要精心准备的峰值状态。 专注让我们效率倍增,却也可能悄悄消耗我们的精力。本文以“注意力隧道效应”为切入点,探讨如何在深度专注与倦怠之间找到平衡,让工作更高效而不透支自己。
493 8
|
Linux 虚拟化 iOS开发
macOS Sequoia 15.1 发布下载,Apple 智能准备就绪
macOS Sequoia 15.1 发布下载,Apple 智能准备就绪
628 11
macOS Sequoia 15.1 发布下载,Apple 智能准备就绪
|
存储 图形学
手机广告常见的10bit是什么?YUV444、YUV422、YUV420、YUV411是什么?
10bit色深相较于8bit,能提供更多的灰阶和显色数,使色彩过渡更加平滑,减少色带现象。YUV444、YUV422、YUV420、YUV411是不同的采样方式,通过减少UV分量来节省空间。YUV420和YUV411虽都是每4个Y分量用1组UV分量,但YUV420在垂直方向上交替存储U和V,而YUV411仅在水平方向上进行4:1抽样。
|
缓存 数据可视化 搜索推荐
HarmonyOS 4.0 实况窗上线!支付宝实现医疗场景智能提醒
HarmonyOS 4.0 实况窗上线!支付宝实现医疗场景智能提醒
915 4
|
机器学习/深度学习 算法
R语言超参数调优:深入探索网格搜索与随机搜索
【9月更文挑战第2天】网格搜索和随机搜索是R语言中常用的超参数调优方法。网格搜索通过系统地遍历超参数空间来寻找最优解,适用于超参数空间较小的情况;而随机搜索则通过随机采样超参数空间来寻找接近最优的解,适用于超参数空间较大或计算资源有限的情况。在实际应用中,可以根据具体情况选择适合的方法,并结合交叉验证等技术来进一步提高模型性能。
1289 5