当前位置: 首页 > news >正文

【JavaScript】原生 JavaScript 实现 localStorage 过期时间

一、核心实现原理

通过存储包含 数据值 + 时间戳 + 过期时间 的复合对象,利用时间差判断数据是否过期:

// 数据结构示例
{value: "实际数据",      // 原始数据time: 1715568000000,   // 存储时间戳(毫秒)expire: 86400000       // 过期时间(毫秒)
}

二、基础实现方法

  1. 函数封装法(推荐)
// 存储数据(支持秒/毫秒单位)
function setWithExpire(key, value, expire) {const now = Date.now();const data = {value: value,time: now,expire: typeof expire === 'number' ? expire * 1000 : expire // 兼容秒单位};localStorage.setItem(key, JSON.stringify(data));
}// 读取数据(自动清除过期项)
function getWithExpire(key) {const item = JSON.parse(localStorage.getItem(key));if (!item) return null;const isExpired = Date.now() - item.time > item.expire;if (isExpired) {localStorage.removeItem(key);return null;}return item.value;
}

调用示例:

setWithExpire('token', 'abc123', 3600); // 1小时后过期
setTimeout(() => getWithExpire('token'), 4000); // 4秒后获取
  1. 原型扩展法(增强原生API)
// 扩展Storage原型
Storage.prototype.setExpire = function(key, value, expire) {const data = { value: value, time: Date.now(), expire: expire };this.setItem(key, JSON.stringify(data));
};Storage.prototype.getExpire = function(key) {const item = JSON.parse(this.getItem(key));if (!item || Date.now() - item.time > item.expire) {this.removeItem(key);return null;}return item.value;
};// 调用方式
localStorage.setExpire('theme', 'dark', 86400000);
console.log(localStorage.getExpire('theme')); 

三、进阶优化方案

  1. 启动时自动清理过期数据
function initStorageExpiration() {Object.keys(localStorage).forEach(key => {try { // 防止非本方案数据干扰const item = JSON.parse(localStorage.getItem(key));if (item?.expire && Date.now() - item.time > item.expire) {localStorage.removeItem(key);}} catch {}});
}
// 页面加载时执行
initStorageExpiration();
  1. 定时清理机制(可选)
// 每小时检查一次
setInterval(() => {Object.keys(localStorage).forEach(key => {getWithExpire(key); // 复用读取时的清理逻辑});
}, 3600000);
http://www.xdnf.cn/news/434863.html

相关文章:

  • Linux常用命令39——free显示系统内存使用量情况
  • 软件测试——面试八股文(入门篇)
  • 项目三 - 任务6:回文日期判断
  • 飞拍技术介绍
  • 从数据中台到数据飞轮:数字化转型的演进之路
  • Google Earth Engine(GEE) 代码详解:批量计算_年 NDVI 并导出(附 Landsat 8 数据处理全流程)
  • 这类物种组织heatmap有点东西
  • MySQL初阶:查询进阶
  • 京东平台商品评论接口接入指南与代码实现
  • D-Hank‘s平衡盐溶液(D-HBSS)无酚红设计 守护细胞活性与数据精准
  • 重生之我是CSDN大佬
  • Spark,RDD中的行动算子
  • curl发送数据不为null,但是后端接收到为null
  • 电子行业专利管理突破:全方位助力创新保护
  • SQL易混点:你知道ON 和 WHERE 的区别吗
  • 在服务器排查java某个线程导致CPU飙高教程
  • 前端实用工具|JavaScript 身份证号合法性校验工具类全解析
  • openFeign远程调用
  • 需求跟踪矩阵准确性的5大策略
  • 基于vllm-ascend的华为atlas大模型部署
  • OrangePi Zero 3学习笔记(Android篇)8 - OpenOCD
  • 什么是原码和补码
  • 【JavaScript】JavaScript实现大数相乘
  • ebook2audiobook开源程序使用动态 AI 模型和语音克隆将电子书转换为带有章节和元数据的有声读物。支持 1,107+ 种语言
  • day013-软件包管理-实战
  • 门禁人脸识别系统详细技术文档
  • 索尼(sony)摄像机格式化后mp4的恢复方法
  • 【基础】Windows开发设置入门2:Windows 终端Windows Terminal
  • FHQ平衡树
  • MCP Server多节点滚动升级一致性治理