JavaScript 数据存储全攻略:从 Cookie 到 IndexedDB

1. Cookie:传统的轻量级存储

Cookie 是最早的客户端存储解决方案之一,最初设计用于服务器和客户端之间的状态保持。

基本用法

javascript

复制

下载

// 设置cookie
document.cookie = "username=JohnDoe; expires=Thu, 18 Dec 2025 12:00:00 UTC; path=/";// 读取cookie
console.log(document.cookie); // 输出所有cookie// 删除cookie(通过设置过期时间为过去)
document.cookie = "username=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";

特点

  • 存储大小限制:约4KB

  • 随每个HTTP请求自动发送到服务器

  • 可以设置过期时间

  • 同源策略限制

适用场景

  • 用户身份验证令牌

  • 简单的用户偏好设置

  • 需要服务器访问的小数据

2. Web Storage:简单的键值对存储

Web Storage 提供了两种机制:localStorage 和 sessionStorage

localStorage

javascript

复制

下载

// 存储数据
localStorage.setItem('theme', 'dark');// 读取数据
const theme = localStorage.getItem('theme'); // 'dark'// 删除数据
localStorage.removeItem('theme');// 清空所有数据
localStorage.clear();

sessionStorage

javascript

复制

下载

// 用法与localStorage相同,但只在当前会话有效
sessionStorage.setItem('tempData', 'some value');

特点

  • 存储大小:通常5-10MB(各浏览器不同)

  • 仅限客户端使用,不会自动发送到服务器

  • localStorage 持久存储,sessionStorage 会话级存储

  • 同步操作,可能阻塞主线程

适用场景

  • 用户偏好设置(主题、语言等)

  • 表单数据临时保存

  • 不需要复杂查询的简单数据

3. IndexedDB:强大的客户端数据库

IndexedDB 是一个完整的客户端 NoSQL 数据库系统,适合存储大量结构化数据。

基本用法

javascript

复制

下载

// 打开或创建数据库
const request = indexedDB.open('MyDatabase', 1);request.onupgradeneeded = (event) => {const db = event.target.result;// 创建对象存储(类似于表)const store = db.createObjectStore('books', { keyPath: 'id' });// 创建索引store.createIndex('by_title', 'title', { unique: false });
};request.onsuccess = (event) => {const db = event.target.result;// 添加数据const transaction = db.transaction('books', 'readwrite');const store = transaction.objectStore('books');store.add({ id: 1, title: 'JavaScript高级编程', author: 'Nicholas C. Zakas' });// 查询数据const getRequest = store.get(1);getRequest.onsuccess = () => {console.log(getRequest.result);};
};request.onerror = (event) => {console.error('数据库错误:', event.target.error);
};

特点

  • 存储大小:通常为磁盘空间的50%(各浏览器不同)

  • 异步操作,不会阻塞UI

  • 支持事务、索引和复杂查询

  • 学习曲线较陡峭

适用场景

  • 离线应用数据存储

  • 需要复杂查询的大量数据

  • 渐进式Web应用(PWA)

  • 需要高性能读写的应用

4. Cache API:网络请求缓存

Cache API 是Service Worker的一部分,主要用于缓存网络请求和响应。

基本用法

javascript

复制

下载

// 打开缓存
caches.open('my-cache').then(cache => {// 添加缓存cache.add('/api/data.json');// 添加多个缓存cache.addAll(['/api/data.json', '/static/logo.png']);// 匹配缓存cache.match('/api/data.json').then(response => {if (response) {console.log('找到缓存:', response);}});
});

特点

  • 专门用于网络请求缓存

  • 与Service Worker紧密集成

  • 支持离线体验

  • 可以缓存任何类型的网络响应

适用场景

  • 离线Web应用

  • 资源缓存加速加载

  • 网络请求的缓存策略

5. 其他存储选项

WebSQL (已废弃)

虽然一些浏览器仍支持,但已被W3C废弃,不建议在新项目中使用。

文件系统API

允许Web应用创建和操作本地文件系统,目前仅Chrome支持。

如何选择合适的存储方案?

选择存储方案时,考虑以下因素:

  1. 数据大小

    • 小数据:Cookie或Web Storage

    • 大数据:IndexedDB

  2. 数据结构

    • 简单键值对:Web Storage

    • 复杂结构化数据:IndexedDB

  3. 数据持久性

    • 会话级:sessionStorage

    • 持久化:localStorage或IndexedDB

  4. 是否需要离线访问

    • 需要:IndexedDB + Cache API

    • 不需要:Web Storage可能足够

  5. 性能要求

    • 高性能:IndexedDB(异步)

    • 简单操作:Web Storage(同步)

最佳实践

  1. 敏感数据:永远不要在客户端存储敏感信息(如密码、支付信息)

  2. 清理策略:定期清理过期或无用数据

  3. 错误处理:所有存储操作都应该有错误处理

  4. 容量检查:存储前检查可用空间

  5. 数据加密:必要时对存储数据进行加密

总结

JavaScript 提供了丰富的客户端存储选项,从简单的 Cookie 到功能强大的 IndexedDB。理解每种技术的优缺点和适用场景,可以帮助你为应用选择最合适的存储方案。随着 Progressive Web Apps 的兴起,客户端存储变得越来越重要,掌握这些技术将帮助你构建更强大、更可靠的Web应用。

希望这篇指南能帮助你在项目中做出明智的存储决策!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/79768.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode 刷题记录 09 —— 链表第三弹

本系列为笔者的 Leetcode 刷题记录,顺序为 Hot 100 题官方顺序,根据标签命名,记录笔者总结的做题思路,附部分代码解释和疑问解答,01~07为C语言,08及以后为Java语言。 01 合并 K 个升序链表 /*** Definitio…

如何利用 Elastic Load Balancing 提升应用性能与可用性?

当今云计算的快速发展中,随着应用需求的增加,如何确保系统能够高效、稳定地处理不断增长的流量成为了每个技术团队关注的焦点。Elastic Load Balancing(ELB)作为一种强大的工具,能够帮助开发者和运维人员轻松应对流量波…

Word如何制作三线表格

1.需求 将像这样的表格整理成论文中需要的三线表格。 2.直观流程 选中表格 --> 表格属性中的边框与底纹B --> 在设置中选择无(重置表格)–> 确定 --> 选择第一行(其实是将第一行看成独立表格了,为了设置中线&…

JVM的双亲委派模型

引言 Java类加载机制中的双亲委派模型通过层层委托保证了核心类加载器与应用类加载器之间的职责分离和加载安全性,但其单向的委托关系也带来了一些局限性。尤其是在核心类库需要访问或实例化由应用类加载器加载的类时,双亲委派模型无法满足需求&#xf…

6.4.高并发设计

目录 一、高并发系统设计基础理论 CAP定理与高可用性权衡 • 一致性(C) vs 可用性(A)在电商、社交场景的取舍 • 分区容错性(P)的实践意义:异地多活与脑裂处理 性能指标与评估模型 • QPS、TP…

工程师转型算法工程师 深入浅出理解transformer-手搓板

编码器 以下部分引用台湾大学李宏毅教授的ppt 自己理解解释一遍(在youtobe 上可以搜索李宏毅即可) 首先先来看transformer的架构图 Embedding 我们先从Imput Embedding 跟 OutPutEmbedding 开始,让我们用 bert 模型来做一个解释 从huggingface上下载的bert-base…

软件工程学概述

一、软件危机 (一)软件危机的介绍 1. 基本思想与定义 软件危机(Software Crisis)是指在计算机软件的开发和维护过程中所遇到的一系列严重问题,这些问题既包括技术层面的挑战,也涉及管理层面的困境。其核心…

【ArcGIS Pro微课1000例】0068:Pro原来可以制作演示文稿(PPT)

文章目录 一、新建演示文稿二、插入页面1. 插入地图2. 插入空白文档3. 插入图像4. 插入视频三、播放与保存一、新建演示文稿 打开软件,新建一个地图文档,再点击【新建演示文稿】: 创建的演示文档会默认保存在目录中的演示文稿文件夹下。 然后可以对文档进行简单的设计,例如…

[吾爱出品][Windows] 产品销售管理系统2.0

[Windows] 产品销售管理系统 链接:https://pan.xunlei.com/s/VOPej1bHMRCHy2np9w3TBOyKA1?pwdgjy7# 使用方法:1、先设置一下图片保存路径 2、维护产品。客户等基础信息。例如:销售类型:一次性 销售编码:RCX。 3、销…

MySQL数据库高可用(MHA)详细方案与部署教程

一:MHA简介 核心功能 二:MHA工作原理 三:MHA组件 四:MHA 架构与工具 MHA架构 Manager关键工具 Node工具 五:工作原理与流程 1: 故障检测 2: 故障切换(Failover) 3 : 切换模式 六&a…

华为设备链路聚合实验:网络工程实战指南

链路聚合就像为网络搭建 “并行高速路”,既能扩容带宽,又能保障链路冗余,超实用! 一、实验拓扑速览 图中两台交换机 LSW1 和 LSW2,PC1、PC2 归属 VLAN 10,PC3 归属 VLAN 30。LSW1 与 LSW2 通过 GE0/0/1、…

数组和集合

数组和集合的区别: 1、数组是固定长度的数据结构,一旦创建长度就无法改变,集合是动态长度数据结构,可根据需求动态增加或减少元素。 2、数组包含基本数据类型和对象,而集合只能包含对象。 3、数组可以直接访问元素&…

WPF MVVM进阶系列教程(一、对话框)

🍠 WPF MVVM进阶系列教程 一、对话框 在前面的文章中,我们介绍了MVVM开发的一些基础知识。 对于日常开发来说,基本已经足够应付大部分场景。 从这里开始,介绍的都是在MVVM模式开发中,提升程序可维护性、灵活性、健壮…

【AI News | 20250507】每日AI进展

AI Repos 1、CFWorkerACME SSL证书助手是一个免费开源的平台,基于Cloudflare Worker运行,旨在自动化SSL证书的申请和下发,尤其适用于多服务器或内网环境。它通过自动化的CNAME和DNS操作完成域名验证,支持Let’s Encrypt、ZeroSSL…

5 分钟用满血 DeepSeek R1 搭建个人 AI 知识库(含本地部署)

最近很多朋友都在问:怎么本地部署 DeepSeek 搭建个人知识库。 老实说,如果你不是为了研究技术,或者确实需要保护涉密数据,我真不建议去折腾本地部署。 为什么呢? 目前 Ollama 从 1.5B 到 70B 都只是把 R1 的推理能力提炼到 Qwen 和 Llama 的蒸馏版本上。 虽说性能是提升…

极狐GitLab 分支管理功能介绍

极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 分支 (BASIC ALL) 分支是项目工作树的一个版本。分支是项目开发的基础。当你创建一个新的项目时,极狐GitLab 会为…

基于ASP.NET+MySQL实现待办任务清单系统

基于ASP.NET的ToDoList的设计与实现 一、前言 1.1 实验目的 使学生综合使用所学过的ASP.NET网络编程知识,掌握网络环境程序设计的基本概念;结合实际的操作和设计,巩固课堂学习内容,掌握网络环境编程的特点、原理和技术&#xf…

普通 html 项目引入 tailwindcss

项目根目录安装依赖 npm install -D tailwindcss3 postcss autoprefixer 初始化生成tailwind.config.js npx tailwindcss init 修改tailwind.config.js /** type {import(tailwindcss).Config} */ module.exports {content: ["./index.html"], //根据自己的项目…

汽车免拆诊断案例 | 2015款奔驰C200L车发动机起动延迟

故障现象  一辆2015款奔驰C200L车,搭载274发动机,累计行驶里程约为15.6万km。该车发动机起动延迟,且发动机故障灯异常点亮。 故障诊断  用故障检测仪检测,发动机控制单元中存储有故障代码“P001685 进气凸轮轴(气缸…

[蓝桥杯 2025 省 B] 水质检测(暴力 )

暴力暴力 菜鸟第一次写题解,多多包涵!!! 这个题目的数据量很小,所以没必要去使用bfs,直接分情况讨论即可 一共两排数据,我们使用贪心的思想,只需要实现从左往右的过程中每个检测器相互连接即…