ExpiringStorage 通过封装 localStorage 实现自动过期管理:setItem 存储带时间戳的对象,getItem 读取时校验并清理过期项,removeItem 和 clear 保持原生行为,支持毫秒/字符串/Date 多种过期格式。
直接用原生 localstorage 无法自动处理过期时间,所以需要封装一层逻辑:存入时记录时间戳,读取时校验是否过期。核心思路是把数据和过期时间一起序列化存储,读取时反序列化并比对当前时间。
封装 setItem 方法:自动添加过期时间
调用时传入 key、value 和过期时长(毫秒),内部生成带 expires 字段的对象再存入:
- 支持数字(毫秒)、字符串(如
"1h"、"7d")或 Date 对象作为过期参数 - 将 value 和 expires 合并为一个对象,用
JSON.stringify存入 - 若传入 0 或负数,表示永不过期,
expires设为null
封装 getItem 方法:自动校验并清理过期项
读取时先解析 JSON,检查 expires 是否存在且小于当前时间:
- 已过期则调用
removeItem清理,并返回null - 未过期才返回原始 value;若解析失败或字段缺失,也返回
null - 不抛错,保持行为与原生 API 一致
补充 removeItem 和 clear 方法(可选但推荐)
这两个方法本身不涉及过期逻辑,但建议保留原生行为,不做额外处理:
-
removeItem(key)直接委托给原生方法 -
clear()同样调用原生localStorage.clear() - 如果想更严格,可在
clear()前遍历所有 key 做一次过期清理(非必须)
使用示例与注意事项
比如设置一个 10 分钟后过期的用户 token:
const storage = new ExpiringStorage();
storage.setItem('token', 'abc123', '10m'); // 支持 '10m'、'2h'、86400000 等
console.log(storage.getItem('token')); // 10 分钟内返回 'abc123',超时返回 null
注意点:
- 不能存储函数、undefined、Symbol 等无法 JSON 序列化的值
- 同域下多个实例共享底层 localStorage,过期逻辑互不影响
- 浏览器关闭不影响过期判断,因为时间基于
Date.now()


















