javascript的localStorage与sessionStorage怎样使用?【教程】

发布时间 - 2026-01-30 00:00:00    点击率:
localStorage和sessionStorage都只能存字符串,存对象必须JSON.stringify()、取时JSON.parse()并加try/catch;区别在于localStorage同源永久共享,sessionStorage仅当前tab有效且关闭即清空。

localStorage 和 sessionStorage 不是“用不用”的问题,而是“该用哪个、怎么存才不会出错”的问题。它们都只能存字符串,存对象不序列化会变成 [object Object],取出来直接 undefined 是最常见的翻车现场。

存数据前必须 JSON.stringify()

直接 localStorage.setItem('user', {name: 'Alice'}) 看似没报错,但实际存进去的是 [object Object] 字符串,后续 JSON.parse() 会 SyntaxError。正确做法:

  • 存对象:先 JSON.stringify(),再 setItem()
  • 取对象:先 getItem(),再 JSON.parse(),且必须加 try/catch —— 因为别人可能手动删改过值,或存了非法 JSON
  • 存数字/布尔值也建议统一走 stringify,避免类型隐式转换陷阱(比如 localStorage.setItem('count', 0) 存的是字符串 "0",取出来

    ++ 就变成 "01"

localStorage 与 sessionStorage 的关键区别

区别不在 API,而在生命周期和作用域:

  • localStorage:同源下永久存在,关浏览器、重启电脑都不丢;所有同源 tab 共享同一份数据
  • sessionStorage:仅当前 tab 有效,关闭 tab 即清空;即使同源,新开 tab 的 sessionStorage 是隔离的
  • 两者都受同源策略限制:https://a.comhttps://b.com 互不可见;httphttps 也算不同源

读取时必须处理 null 和解析失败

getItem() 找不到键时返回 null,不是 undefined,直接 JSON.parse(null) 会抛 SyntaxError。安全读取模式:

function getFromStorage(key) {
  const raw = localStorage.getItem(key);
  if (!raw) return null;
  try {
    return JSON.parse(raw);
  } catch (e) {
    console.warn(`Invalid JSON in localStorage key "${key}"`);
    return null;
  }
}

别省略 try/catch —— 用户用开发者工具乱改、插件干扰、跨域写入失败残留垃圾值,都很常见。

注意存储上限和性能边界

大多数浏览器给每个源分配约 5–10MB localStorage 空间,但它是同步阻塞 API,大体积数据(如 >1MB)读写会卡主线程。实际使用中:

  • 避免存日志、原始图片 base64、未压缩的数组列表
  • 高频更新场景(如打字实时存草稿)用 debounce 控制写入频率,否则频繁 setItem 可能触发性能告警
  • sessionStorage 虽然自动清理,但大体积数据仍会拖慢 tab 启动速度,尤其在低端设备上

真正容易被忽略的点是:它们都只支持字符串,且没有内置的过期机制 —— 想实现“7天后自动失效”,得自己存时间戳并每次读取时判断,不能依赖 storage 本身。


# javascript  # java  # js  # json  # 浏览器  # 电脑  # 工具  # session  # 跨域  # 区别  # 作用域  # Object  # NULL  # count  # try  # catch  # 字符串  # 线程  # 主线程  # undefined  # 对象  # http  # https  # 的是  # 清空  # 都不  # 找不到  # 而在  # 它是  # 都很  # 新开  # 也算  # 报错 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  Laravel如何实现密码重置功能_Laravel密码找回与重置流程  如何做网站制作流程,*游戏网站怎么搭建?  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  如何为不同团队 ID 动态生成多个独立按钮  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  Linux系统命令中tree命令详解  网站优化排名时,需要考虑哪些问题呢?  如何在建站宝盒中设置产品搜索功能?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  Bootstrap CSS布局之列表  Laravel安装步骤详细教程_Laravel环境搭建指南  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  Windows Hello人脸识别突然无法使用  企业网站制作这些问题要关注  如何用虚拟主机快速搭建网站?详细步骤解析  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  JavaScript如何实现路由_前端路由原理是什么  如何快速建站并高效导出源代码?  微信小程序 require机制详解及实例代码  Laravel怎么为数据库表字段添加索引以优化查询  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  Mybatis 中的insertOrUpdate操作  智能起名网站制作软件有哪些,制作logo的软件?  Python文件操作最佳实践_稳定性说明【指导】  MySQL查询结果复制到新表的方法(更新、插入)  Laravel如何创建自定义Artisan命令?(代码示例)  如何破解联通资金短缺导致的基站建设难题?  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  微信h5制作网站有哪些,免费微信H5页面制作工具?  jquery插件bootstrapValidator表单验证详解  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  如何在不使用负向后查找的情况下匹配特定条件前的换行符  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)