JavaScript无法直接获取LocalStorage精确字节数,因规范未暴露底层用量接口且浏览器实现差异大;可通过JSON.stringify序列化所有键值并乘以2估算UTF-16字节数。

JavaScript 本身没有直接提供获取 LocalStorage 实际占用字节数的 API,但可以通过序列化所有键值对并计算其 UTF-16 字符长度(再换算为近似字节数)来估算已用容量。
为什么不能直接读取 LocalStorage 占用大小?
LocalStorage 是浏览器提供的简单键值存储,规范未暴露底层存储用量接口。不同浏览器实现细节不同(如 Chrome 使用 UTF-16 编码计数,Safari 可能有额外元数据开销),因此只能估算,无法精确到字节级。
统计已用容量的实用方法
核心思路:遍历所有 key,将 key 和 value 分别转为字符串,累加它们的 .length(即 UTF-16 码元个数),再乘以 2 得到近似字节数(因为 JavaScript 字符串内部按 UTF-16 存储,多数常用字符占 2 字节;含代理对的字符如某些 emoji 占 4 字节,此处按平均估算)。
- 使用
Object.keys(localStorage).length获取条目数量,仅作参考,不反映容量 - 用
encodeURIComponent或JSON.stringify处理特殊字符更安全(避免因未编码导致 length 失真) - 推荐统一用
JSON.stringify序列化 key 和 value,再计算 length,兼容空值、布尔、数字等类型
一段可直接运行的统计代码
(注意:该结果是估算值,单位为字节)
立即学习“Java免费学习笔记(深入)”;
function getLocalStorageSize() {
let total = 0;
for (let key in localStorage) {
if (localStorage.hasOwnProperty(key)) {
// 序列化 key 和 value,避免 toString() 对 null/undefined/boolean 的歧义
const keyStr = JSON.stringify(key);
const valStr = JSON.stringify(localStorage[key]);
total += keyStr.length + valStr.length;
}
}
return total * 2; // 近似字节数(UTF-16 每个码元通常 2 字节)
}
<p>console.log('LocalStorage 已用容量 ≈', getLocalStorageSize(), 'bytes');
// 示例输出:LocalStorage 已用容量 ≈ 1248 bytes
注意事项与边界情况
- 若某 value 是对象或数组,
localStorage[key]会自动调用toString()(如[1,2].toString() === "1,2"),但实际存入的是字符串,所以直接用JSON.stringify更准确还原存储内容 - 部分浏览器对单个 key 或 total 有 5MB~10MB 限制(典型为 5MB),超过会抛
QuotaExceededError - 隐私模式下可能禁用或重置 LocalStorage,调用前建议包裹 try/catch
- 不建议高频调用该函数,它需遍历全部键值,对大数据量 LocalStorage 有轻微性能影响


















