Web Storage无配额超限通知机制,需手动防御性编程:先预判容量、再尝试写入、捕获QuotaExceededError、执行分级清理(如LRU/优先级/大小排序)、最后重试或降级。

Web Storage(localStorage 和 sessionStorage)本身不提供“配额超限”的主动通知机制,也没有内置的缓存清理策略。当写入 JSON 数据导致超出浏览器配额(通常为 5–10 MB,因浏览器而异)时,会直接抛出 QuotaExceededError 异常。因此,“安全捕获并清理”需靠手动防御性编程实现——核心是:先预判、再尝试、捕获异常、按策略清理、最后重试或降级。
检测并捕获 QuotaExceededError
所有 JSON 存储操作都应包裹在 try...catch 中,明确捕获配额错误,避免静默失败:
<!-- 示例:安全保存 JSON -->
function safeSetItem(key, obj) {
try {
const json = JSON.stringify(obj);
localStorage.setItem(key, json);
} catch (err) {
if (err.name === 'QuotaExceededError') {
console.warn('localStorage 额度已满,触发清理策略');
cleanupStorage();
// 可选:重试一次(确保清理后有空间)
try {
localStorage.setItem(key, JSON.stringify(obj));
} catch (e) {
console.error('清理后仍写入失败,考虑降级方案', e);
fallbackToMemoryOrIndexDB(obj);
}
} else {
throw err; // 其他错误正常抛出
}
}
}设计可预测的清理策略
盲目清空全部数据不可取。推荐按使用频率或时间维度分级清理,兼顾业务语义:
立即学习“Java免费学习笔记(深入)”;
-
按访问时间淘汰(LRU):给每条 JSON 记录附加
lastUsed时间戳,定期删除最久未用的 N 条; -
按优先级标记:存储前约定 key 前缀(如
cache:high:、cache:low:),清理时只删low类; -
按大小排序清理:遍历所有 key,用
JSON.stringify(localStorage.getItem(k)).length估算体积,优先移除最大几项。
提前估算容量,避免临界写入
在写入前粗略判断是否可能超限,减少异常触发频率:
// 估算当前占用 + 待写入 JSON 字符数
function estimateStorageUsage() {
let total = 0;
for (let i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i);
const val = localStorage.getItem(key);
total += (key.length + (val ? val.length : 0));
}
return total;
}
<p>const newJsonSize = JSON.stringify(myData).length;
if (estimateStorageUsage() + newJsonSize > 4.8 <em> 1024 </em> 1024) { // 留 200KB 缓冲
cleanupStorage();
}降级方案必须就位
当清理后仍无法写入,说明用户环境长期超载或存在其他限制(如隐私模式下 localStorage 被禁用),此时应无缝切换:
- 改用
sessionStorage(仅当前会话,容量通常相同但隔离); - 退回到内存对象缓存(
const memoryCache = new Map()),页面刷新即失效但保功能; - 升级到 IndexedDB(支持数十 MB 甚至 GB 级结构化存储,适合大量 JSON)。



















