当前位置: 首页 > 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);

相关文章:

  • ubuntu----100,常用命令2
  • 裸机开发的核心技术:轮询、中断与DMA
  • 定制化项目变更通知延误、流程失控?日事清用条件分支判断规范跨部门协作与变更管理流程
  • STM32 __main
  • Python实验2
  • win10 局域网内聊天
  • 《Python星球日记》 第67天:Transformer 架构与自注意力机制
  • vscode 同一个工作区,不同文件夹之间跳转问题
  • git 怎么更改本地的存储的密码
  • HCIP实验(BGP联邦实验)
  • Linux—进度条实现
  • upload-labs通关笔记-第4关 文件上传之.htacess绕过
  • FFmpeg3.4 libavcodec协议框架增加新的decode协议
  • HarmonyOS 【诗韵悠然】AI古诗词赏析APP开发实战从零到一系列(一、开篇,项目介绍)
  • 物理:由基本粒子组成的个体能否提炼和重组?
  • Realman RM65-B 六自由度超轻量仿人机械臂
  • openjdk底层汇编指令调用(三)——编码
  • CSS可以继承的样式汇总
  • 【fastadmin开发实战】在前端页面中使用bootstraptable以及表格中实现文件上传
  • 使用全局状态管理(Vuex)实现数据共享​
  • 中国-拉共体成员国重点领域合作共同行动计划(2025-2027)
  • 落实中美经贸高层会谈重要共识,中方调整对美加征关税措施
  • 联合国秘书长欢迎中美经贸高层会谈成果
  • 十三届全国政协经济委员会副主任张效廉被决定逮捕
  • 5.19中国旅游日,上海56家景区景点限时门票半价
  • 雷军:过去一个多月是创办小米以来最艰难的时间