javascript本地存储是什么_localStorage和sessionStorage如何选择?

localStorage用于长期存储同源数据(5–10MB),需序列化;sessionStorage仅限当前标签页,刷新保留、关闭清空;二者API相同但数据隔离,支持storage事件跨窗口通信。

本地存储就是浏览器给你留的两个小抽屉,localStorage 是长期保存的抽屉,关掉页面甚至重启电脑都还在;sessionStorage 是临时抽屉,只在当前标签页生命周期内有效,关掉标签就清空。

什么时候该用 localStorage

适合存那些「用户明确希望下次打开还能看到」的数据,比如:主题偏好、折叠面板状态、搜索历史、已登录用户的 token(注意:敏感 token 更推荐配合后端短期刷新机制,别只靠它)。

关键限制要注意:

  • localStorage 的数据是**同源(协议+域名+端口)隔离**的,https://a.comhttp://a.com 互不可见
  • 容量通常为 5–10 MB,但不同浏览器有差异,别指望存大文件或大量 JSON
  • 所有操作都是同步阻塞的,频繁写入大对象可能卡住主线程
  • 不支持直接存对象,必须用 JSON.stringify() 序列化,读取时用 JSON.parse()

什么时候该用 sessionStorage

适合存「只在这一次浏览中需要延续」的状态,比如:表单草稿、多步流程的中间数据、临时筛选条件、未提交的购物车(仅限当前会话)。

特别注意它的边界:

  • 新开一个标签页或窗口,哪怕 URL 完全一样,sessionStorage 也是全新的,彼此不共享
  • 页面刷新、前进后退都保留,只有关闭标签页或调用 sessionStorage.clear() 才会丢
  • localStorage 一样不支持直接存对象,也要手动序列化/反序列化

localStoragesessionStorage 的 API 完全一致,但数据不互通

它们都提供 setItem()getItem()removeItem()clear() 这四个方法,用法一模一样。但你往 localStorage 存的东西,在 sessionStorage 里绝对 getItem() 不出来,反之亦然——它们是两套独立的键值空间。

例如:

localStorage.setItem('user', JSON.stringify({ id: 123, name: 'Alice' }));
sessionStorage.setItem('tempSearch', 'react hooks');

console.log(localStorage.getItem('tempSearch')); // null
console.log(sessionStorage.getItem('user'));     // null

别忽略监听变化和清理时机

两个存储都支持 storage 事件,但它**只在其他同源窗口触发变更时才通知当前窗口**,自己改的不会触发自己监听。所以不能靠它做「本窗口数据更新反馈」,更适合跨标签通信(比如 A 标签登出,B 标签收到事件自动跳转)。

清理方面容易被忽略的点:

  • 没手动 removeItem()clear() 的数据会一直占着位置,尤其 localStorage 可能越积越多
  • 用户手动清除浏览器缓存时,这两个存储默认也会被清掉(取决于用户勾选了哪些选项)
  • 如果存的是过期 token 或旧版本结构数据,应用启动时最好加一层校验逻辑,避免 JSON.parse() 报错或读出脏数据