localstorage 容量非固定5mb,实际因浏览器而异:chrome/edge约10mb、firefox约5mb、ios safari低至2.5mb;按源隔离,超限时setitem()抛quotaexceedederror。

localStorage 容量到底是多少?别信“5MB”这个老黄历
实际能用的容量远比文档写的模糊——不是固定值,而是由浏览器、系统、甚至当前磁盘压力共同决定的。Chrome 和 Edge 现在普遍在 10MB 左右(非绝对),Firefox 约 5MB,Safari 在 iOS 上可能低至 2.5MB;更关键的是,它按「源(origin)」隔离,https://a.com 和 https://b.com 互不干扰。
- 浏览器不会提前告诉你快满了,
setItem()突然抛出QuotaExceededError是唯一信号 - 容量计算包含 key + value 的 UTF-16 字符长度(不是字节数),中文字符算 2 个单位
- 清空缓存、启用无痕模式、或切换用户配置文件,都可能重置可用空间,但不能靠这个“扩容”
怎么安全地写入数据,避免 QuotaExceededError?
不能靠 try/catch 盲写,得先预估+试探。核心思路是:用 localStorage.length 和 localStorage.key(i) 遍历已有项,粗略估算总字符数,再留出 10% 余量。
- 写入前先调用
localStorage.setItem('test', 'x')快速探路,成功后立刻removeItem('test')—— 这是最轻量的“是否还能写”判断 - 真正存大对象前,用
JSON.stringify(obj).length算长度,别直接塞obj(会转成[object Object]) - 如果已接近上限,优先删过期项(比如 key 带
_ts后缀的时间戳),别等报错才处理
想存超过 10MB?localStorage 本身不支持扩容,但可以绕
localStorage 是单源、同步、阻塞式 API,硬扩容没意义。真有大数据需求,得换技术栈,而不是给它打补丁。
- 优先用
IndexedDB:支持结构化数据、事务、异步,单库轻松上50MB+(Chrome 对持久化存储无硬上限) - 临时方案可结合
Blob+URL.createObjectURL()存二进制,但页面刷新后失效,仅适合 session 级缓存 - 千万别用 base64 编码大文件塞进 localStorage——体积膨胀 33%,还触发更快的配额耗尽
移动端特别容易翻车的几个点
iOS Safari 是重灾区:不仅容量小,还会在后台标签页中主动清理 localStorage,尤其内存紧张时。
立即学习“前端免费学习笔记(深入)”;
- 不要假设「刚存的值下秒还在」,关键数据写入后建议立即
getItem()校验 - 微信内置浏览器(X5 内核)对
localStorage有额外限制,部分机型实测低于1MB,必须降级到sessionStorage或服务端兜底 - Android WebView 若未显式调用
WebSettings.setDomStorageEnabled(true),localStorage默认是关的











