JavaScript 浏览器本地存储

JavaScript 浏览器本地存储

一、为什么需要本地存储

浏览器默认是无状态的------每次刷新页面,JavaScript 中的所有变量都会重置。如果希望数据在页面刷新后仍然存在(比如用户登录状态、主题偏好、表单草稿等),就需要使用浏览器提供的本地存储功能。

二、localStorage 与 sessionStorage

HTML5 引入了 localStoragesessionStorage 两个对象,它们都属于 Web Storage API,用于在浏览器中以键值对的形式存储数据。

2.1 基本 API

两者使用完全相同的接口:

javascript 复制代码
// 存储数据
localStorage.setItem("username", "zhangsan");

// 读取数据
const name = localStorage.getItem("username");
console.log(name); // "zhangsan"

// 删除某一项
localStorage.removeItem("username");

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

sessionStorage 的用法一模一样:

javascript 复制代码
sessionStorage.setItem("temp", "hello");
sessionStorage.getItem("temp"); // "hello"
sessionStorage.removeItem("temp");
sessionStorage.clear();

2.2 两者的区别

特性 localStorage sessionStorage
生命周期 永久保存,除非手动删除 关闭标签页即自动清除
页面刷新 数据仍存在 数据仍存在
跨标签页(同源) 共享 不共享,各自独立
典型用途 记住用户偏好、主题 保存表单草稿、临时状态

一句话区分localStorage 持久保存,sessionStorage 随标签页关闭而消失。

2.3 简单示例:记住用户名

html 复制代码
<!DOCTYPE html>
<html>
<body>
  <input type="text" id="username" placeholder="输入用户名">
  <button onclick="saveName()">保存</button>
  <button onclick="clearName()">清除</button>

  <script>
    const input = document.getElementById("username");

    // 页面加载时,如果 localStorage 中有用户名,就回填到输入框
    const saved = localStorage.getItem("username");
    if (saved) {
      input.value = saved;
    }

    function saveName() {
      localStorage.setItem("username", input.value);
      alert("已保存");
    }

    function clearName() {
      localStorage.removeItem("username");
      input.value = "";
    }
  </script>
</body>
</html>

刷新页面后,输入框中仍然会显示之前保存的用户名,这就是 localStorage 的作用。

三、特性

3.1 只能存储字符串

localStoragesessionStorage 的值只能是字符串类型。如果存入数字、布尔值或对象,会被自动转为字符串:

javascript 复制代码
localStorage.setItem("count", 100);
console.log(typeof localStorage.getItem("count")); // "string",不是 "number"

要存储对象,需要用 JSON.stringify 转换,读取时用 JSON.parse 还原:

javascript 复制代码
const user = { name: "zhangsan", age: 20 };

// 存入
localStorage.setItem("user", JSON.stringify(user));

// 取出并还原
const saved = JSON.parse(localStorage.getItem("user"));
console.log(saved.name); // "zhangsan"
console.log(saved.age);  // 20

3.2 容量限制

每个域名下的 localStoragesessionStorage 各自有约 5MB 的存储空间。超出限制时,写入操作会抛出异常:

javascript 复制代码
try {
  localStorage.setItem("key", "value");
} catch (e) {
  console.log("存储空间已满");
}

四、Todo 列表

下面使用 localStorage 实现一个可以持久保存的待办事项列表:

html 复制代码
<!DOCTYPE html>
<html>
<body>
  <h2>待办事项</h2>
  <input type="text" id="taskInput" placeholder="输入新任务">
  <button onclick="addTask()">添加</button>
  <ul id="taskList"></ul>

  <script>
    // 从 localStorage 读取已有任务
    function loadTasks() {
      const raw = localStorage.getItem("tasks");
      return raw ? JSON.parse(raw) : [];
    }

    // 保存任务到 localStorage
    function saveTasks(tasks) {
      localStorage.setItem("tasks", JSON.stringify(tasks));
    }

    // 渲染列表
    function render() {
      const tasks = loadTasks();
      const list = document.getElementById("taskList");
      list.innerHTML = "";
      tasks.forEach((task, index) => {
        const li = document.createElement("li");
        li.textContent = task;
        // 点击删除
        li.onclick = () => {
          tasks.splice(index, 1);
          saveTasks(tasks);
          render();
        };
        list.appendChild(li);
      });
    }

    // 添加任务
    function addTask() {
      const input = document.getElementById("taskInput");
      const text = input.value.trim();
      if (!text) return;
      const tasks = loadTasks();
      tasks.push(text);
      saveTasks(tasks);
      input.value = "";
      render();
    }

    // 页面加载时渲染
    render();
  </script>
</body>
</html>

刷新页面后,之前添加的任务仍然存在------因为数据保存在 localStorage 中。

五、其他存储方式简介

除了 Web Storage,浏览器还提供了其他存储机制。这里做一个简要了解,后续深入学习时会详细展开:

  • Cookie:最古老的存储方式,容量只有 4KB,会随每次 HTTP 请求自动发送给服务端。主要用于维持登录会话。
  • IndexedDB:浏览器内置的"数据库",容量远大于 Web Storage(通常几百 MB),用于存储大量结构化数据。
相关推荐
开开心心就好11 小时前
批量提取PDF中的图片,直接导出原图
前端·javascript·支持向量机·智能手机·pdf·html·启发式算法
IvanCodes13 小时前
Python 数据处理(十三):JSON、CSV 与数据序列化
开发语言·python
aramae14 小时前
MySQL复合查询(8)
java·c语言·开发语言·后端·算法
默_笙15 小时前
🏛 给 AI 配一间办公室:Harness Engineering 六大模块与它的实现
前端·javascript
linux_cfan16 小时前
videojs v10 源代码系列解读:14 · 谓词守卫:在运行时安全地调用能力
前端·javascript·音视频
qq_25183645717 小时前
springboot vue3 开发实现 拼豆管理系统
java·开发语言·ai编程
郑州光合科技余经理17 小时前
同城外卖小程序开发:下单成功后,后台导出能不能对上用户端状态
开发语言·前端·git·后端·uni-app·php·ai编程
知识分享小能手18 小时前
C++ 学习教程,从入门到精通,C++ 入门知识 — 完整知识点(1)
开发语言·c++·学习
+VX:Fegn089518 小时前
计算机毕业设计|基于springboot + vue旅游管理系统(源码+数据库+文档)
java·开发语言·vue.js·spring boot·课程设计
天若有情67319 小时前
【纯前端小工具】公历生日转农历,批量查询每年农历生日对应的公历日期(GitHub Pages在线直接用)
前端·javascript·github pages·农历转换·lunisolar·网页小工具