Cookie,sessionStorage,localStorage,IndexedDB 介绍

2025年08月01日 Tags: Js


参考链接:

MDN:

其他:

定义

HTTP 请求标头,可通过服务器设置 Set-Cookie 表头或 js 通过 document.cookie 进行设置。

大小

4KB

形式

Cookie: key1=value1; key2=value2 ...

键值对以“分号+空格”进行分隔。

分类

根据是否设置过期时间(Expires)和有效期(Max-Age)分为会话期 Cookie 和 持久性 Cookie。

存储位置

会话期 Cookie 存储在内存中,持久性 Cookie 存储在硬盘中。

特点

使用场景

  1. 存储 Refresh Token(需要携带 HttpOnly=true; Secure=true; SameSite=Strict
  2. 会话状态管理(如用户登录状态、购物车、游戏分数或其他需要记录的信息)
  3. 个性化设置(如用户自定义设置、主题等)
  4. 浏览器行为跟踪(如跟踪分析用户行为)

如何使用

通常,服务器在收到首个 HTTP 请求后,在响应头例添加一个或多个 Set-Cookie 选项,浏览器收到响应后通常会保存 Cookie,并将其放在 HTTP Cookie 标头内,在向同一服务器发出请求时一起发送。

response.setHeader('Set-Cookie', ['type=ninja', 'language=javascript']);

响应体:

HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: type=ninja
Set-Cookie: language=javascript

后续请求头:

Cookie: type=ninja; language=javascript

前端获取 Cookie 值的方式:

🧐通过 document.cookie 获取到 cookie 字符串后如何处理,方便后续使用?

sessionStorage

特点

形式

存储数据为字符串,因此对象格式的数据存储需要转换成 JSON 格式。

大小

5MB-10MB 不等,一般现代浏览器至少会分配 5MB 空间,实际大小受设备实际存储空间用量动态分配。

存储位置

通常是内存中。

sessionStorage 会共享的情况(受同源影响)

如果 a 标签没有添加 rel="opener" 属性,跳转时是不会复制顶级页面的 sessionStorage 的。这是因为 Chrome 89 版本更新后,通过 a 标签 target="_blank" 跳转会导致 sessionStorage 丢失,原因是默认添加了 noopener 属性。

localStorage

特点

使用场景

封装 localStorage

const myStorage = {
  set(key, value) {
    const time = Date.now();
    localStorage.setItem(key, JSON.stringify({ time, value }));
  },
  get(key) {
    const valueJson = localStorage.getItem(key);
    if (!valueJson) return null;
    const { time, value } = JSON.parse(valueJson);
    const expiresTime = 60;
    if (Date.now() - time > expiresTime) {
      localStorage.removeItem(key);
      return null;
    } else {
      return value;
    }
  }
}

🧐如何用代码控制 localStorage 用量?

❓Safari 的无痕浏览模式

IndexedDB

定义

一个事务型数据库系统,是一个基于 JavaScript 的面向对象数据库。

特点

大小

多达几个GB,受设备实际存储空间用量动态分配。

存储位置

本地磁盘


待探索:

← 上一篇: 语义化版本(SemVer)

下一篇: → 面试题:500条数据渲染加载卡顿(分页),不能使用懒加载、虚拟滚动,如何解决?