怎样用JavaScript实现本地存储?

来源:安卓APP网作者:兔子头衔:草根站长
导读:本期聚焦于小伙伴创作的《怎样用JavaScript实现本地存储?》,敬请观看详情。浏览器崩溃后用户填了一半的表单数据全没了,这种体验谁都受不了。JavaScript提供了三套本地存储方案来解决这类问题。localStorage以键值对形式把数据存在硬盘上,关闭标签页也不会丢失,适合存用户偏好设置。sessionStorage生命周期只在一个标签页会话内,新开窗口就读不到。遇到要存大量结构化数据或做离线缓存,就得用IndexedDB这种支持事务的数据库。选错存储方式轻则浪费内存,重则泄露敏感信息。弄清楚它们的容量限制、读写API和过期机制,才能写出靠谱的前端持久化代码。

在Web开发中,把数据暂存到用户浏览器端是常见的需求,比如记住登录状态、缓存接口结果或者保存草稿。JavaScript主要通过Web Storage API和IndexedDB来实现本地存储,不同方案在生命周期、容量和结构上差别很大。

怎样用JavaScript实现本地存储?

一、localStorage的基本用法

localStorage是最简单的本地存储方式,它以字符串键值对的形式将数据保存在浏览器中,除非用户手动清除或用代码删除,否则数据永远存在。它的API非常直观,只有setItem、getItem、removeItem和clear四个方法。

下面演示如何存一个用户名并在刷新后读取:

// 保存数据到localStorage
localStorage.setItem('username', 'zhangsan');

// 读取数据
var name = localStorage.getItem('username');
console.log(name); // 输出 zhangsan

// 删除某条数据
localStorage.removeItem('username');

// 清空所有localStorage
localStorage.clear();

需要注意的是,localStorage只能存字符串。如果要保存对象,必须用JSON.stringify转换,读取时再用JSON.parse还原。另外,不同浏览器对localStorage的容量限制一般是5MB左右,存太多会抛异常。

它的优点是用起来零门槛、同步读写不费事;缺点是容量小、且同源页面共享,容易引发多标签页数据覆盖问题。敏感信息如token不建议直接放这里,因为任何脚本都能读取。

二、sessionStorage与localStorage的区别

sessionStorage的接口和localStorage完全一致,但数据只在当前标签页会话期间有效。一旦关闭标签页或浏览器,数据就被回收。即便同一个网站,从A页面新开一个标签页打开B页面,两者的sessionStorage也是互相隔离的。

这一特性特别适合存“一次性”数据,比如表单分步填写时的临时状态:

// 在步骤一页面保存表单数据
sessionStorage.setItem('step1', JSON.stringify({ phone: '13800000000' }));

// 步骤二页面读取,关闭后自动消失
var step1 = JSON.parse(sessionStorage.getItem('step1'));

对比来看,localStorage像冰箱里的存货,sessionStorage像手里的便签。如果做单页应用且不想污染全局存储,用sessionStorage能减少跨模块干扰。不过它同样只支持字符串、容量也有限。

在真实项目中,我们常把不变的配置放localStorage,把流程中的临时变量放sessionStorage,这样刷新页面不丢进度,关掉页面又不留垃圾。

三、用IndexedDB存储复杂数据

当要存上百条记录、文件blob或需要按索引查询时,Web Storage就力不从心了。IndexedDB是浏览器内置的事务型数据库,允许存任意结构化数据,容量通常可达几百MB甚至更多。

下面是一个打开数据库并写入一条记录的例子:

// 打开或创建数据库
var request = indexedDB.open('myDB', 1);

request.onupgradeneeded = function(event) {
  var db = event.target.result;
  // 创建对象仓库,指定主键
  if (!db.objectStoreNames.contains('users')) {
    db.createObjectStore('users', { keyPath: 'id' });
  }
};

request.onsuccess = function(event) {
  var db = event.target.result;
  var tx = db.transaction('users', 'readwrite');
  var store = tx.objectStore('users');
  // 存入一个对象
  store.put({ id: 1, name: 'lisi', age: 20 });
  tx.oncomplete = function() {
    console.log('数据写入完成');
  };
};

IndexedDB基于事件回调,早期写起来比较绕,现在也可用Promise封装。它支持索引、游标遍历和版本迁移,适合离线应用和大量缓存。缺点是API复杂,新手容易在事务生命周期上踩坑。

如果项目只是存点简单配置,杀鸡无需用牛刀;但要做类原生App的Web应用,IndexedDB几乎是必选项。社区里也有localForage这类库,把localStorage和IndexedDB统一成简单异步接口。

四、存储方案的选择建议

面对三种方案,核心看数据体量、存活时长和结构复杂度。小且长期用的配置选localStorage;临时会话数据选sessionStorage;大且需查询的选IndexedDB。

另外要强调,任何本地存储都不等于安全存储。不要把明文密码、未加密的令牌写进这些地方。如果必须存,可结合Web Crypto API做一层加密再落盘,降低XSS带来的泄露风险。

方案生命周期容量数据类型
localStorage永久约5MB字符串
sessionStorage标签页会话约5MB字符串
IndexedDB永久数百MB+结构化任意值

理清这些差异后,根据业务场景组合使用,就能用JavaScript稳稳地实现本地存储,既提升体验又避免资源浪费。

localStoragesessionStorageIndexedDB修改时间:2026-08-05 20:45:27

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。