0

0

javascript localStorage_如何持久化存储数据

幻影之瞳

幻影之瞳

发布时间:2026-01-10 20:05:19

|

447人浏览过

|

来源于php中文网

原创

localStorage默认持久化,但需避免无痕模式、跨协议访问、未序列化对象、重复覆盖等误用;存取对象须用JSON.stringify/parse并try-catch;storage事件不触发当前页;容量受限且因编码差异实际可用空间不同。

javascript localstorage_如何持久化存储数据

localStorage 本身就能持久化,但有前提条件

localStorage 不是“需要额外操作才能持久化”,它默认就是持久存储——只要用户没手动清除、没启用无痕模式、没用脚本调用 localStorage.clear()localStorage.removeItem(),数据就会一直留在浏览器里,关机重启也不丢。

真正导致“存不住”的,几乎全是开发侧误用或环境限制:

  • 在 Chrome 无痕窗口、Firefox 私密窗口中写入,关闭窗口即清空
  • 把对象直接赋值给 localStorage.setItem('key', obj) —— 这会自动转成 [object Object],取出来是废字符串
  • 在 HTTP 页面里尝试读取 HTTPS 域名下存的 localStorage(跨协议隔离)
  • 单页应用路由切换时,误在 useEffectmounted 里反复覆盖同个 key,逻辑上“覆盖”了旧数据

存对象必须 JSON 序列化,取回要 try-catch 解析

localStorage 只接受字符串作为 value。直接塞对象、数组、日期、函数都会被 toString(),结果不可逆。

正确做法是显式用 JSON.stringify() 存,用 JSON.parse() 取,并始终包裹 try...catch —— 因为用户可能手动编辑过 localStorage 里的值,导致 JSON 格式损坏。

立即学习Java免费学习笔记(深入)”;

const saveUser = (user) => {
  try {
    localStorage.setItem('user', JSON.stringify(user));
  } catch (e) {
    console.error('localStorage write failed:', e);
  }
};

const loadUser = () => {
  try {
    const str = localStorage.getItem('user');
    return str ? JSON.parse(str) : null;
  } catch (e) {
    console.warn('localStorage parse failed, returning null');
    return null;
  }
};

注意 StorageEvent 监听只在其他 tab 触发

storage 事件不会在当前写入的标签页触发,只通知同源下的其他打开的页面。这是规范行为,不是 bug。

NetShop网店系统
NetShop网店系统

NetShop软件特点介绍: 1、使用ASP.Net(c#)2.0、多层结构开发 2、前台设计不采用任何.NET内置控件读取数据,完全标签化模板处理,加快读取速度3、安全的数据添加删除读取操作,利用存储过程模式彻底防制SQL注入式攻击4、前台架构DIV+CSS兼容IE6,IE7,FF等,有利于搜索引挚收录5、后台内置强大的功能,整合多家网店系统的功能,加以优化。6、支持三种类型的数据库:Acces

下载

如果你在 A 页面调用 localStorage.setItem('theme', 'dark'),想让 A 页面自己立刻响应,不能依赖 storage 事件监听 —— 得同步更新本地状态,再手动触发 UI 更新。

典型误用场景:

  • 在 Vue 的 watch 或 React 的 useEffect 里只监听 storage 事件,却忘了当前页修改后也要同步 state
  • 以为 storage 事件能替代状态管理,结果发现“自己改了没反应”

容量限制和字符编码会影响实际可用空间

虽然常说 localStorage 是 5MB,但这是**字符串 UTF-16 编码长度**的近似上限(Chrome 约 5.2MB,Safari 约 2.5MB,Firefox 更宽松但仍有硬限)。一个中文字符占 2 字节,Base64 字符串体积膨胀约 33%,存大图片 data URL 容易超限。

检查是否写入失败的可靠方式是捕获异常,而不是靠 localStorage.length 判断:

try {
  localStorage.setItem('bigData', hugeString);
} catch (e) {
  if (e.name === 'QuotaExceededError') {
    console.error('localStorage quota exceeded');
  }
}

真正需要持久化大量结构化数据时,localStorage 不是合适选择 —— 考虑 IndexedDB 或服务端落库。localStorage 适合存 token、主题偏好、表单草稿这类轻量、键值明确、且能容忍丢失的用户状态。

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

552

2023.06.20

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

374

2023.07.04

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

730

2023.07.04

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

475

2023.09.01

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

394

2023.09.04

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

990

2023.09.04

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

656

2023.09.12

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

551

2023.09.20

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

25

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Vue 教程
Vue 教程

共42课时 | 6.3万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 1.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号