js indexeddb 和 localstorage 的存储空间限制
【摘要】 在JavaScript中,IndexedDB和localStorage的存储空间上限及超出限制时的行为存在显著差异,具体如下: 1. localStorage的存储空间上限统一配额:所有浏览器均限制同一源(域名)下localStorage的存储上限为5MB。这一限制包含localStorage和sessionStorage的总和(合计约10MB)。超出限制的行为:当存储数据超过5MB时,浏览...
在JavaScript中,IndexedDB和localStorage的存储空间上限及超出限制时的行为存在显著差异,具体如下:
1. localStorage的存储空间上限
- 统一配额:所有浏览器均限制同一源(域名)下localStorage的存储上限为5MB。这一限制包含localStorage和sessionStorage的总和(合计约10MB)。
- 超出限制的行为:当存储数据超过5MB时,浏览器会直接抛出
QuotaExceededError异常,导致写入操作失败。例如:try { localStorage.setItem('largeData', new Array(10 * 1024 * 1024).join('x')); // 尝试存储10MB数据 } catch (e) { console.error('存储失败:', e.name); // 输出: QuotaExceededError }
2. IndexedDB的存储空间上限
- 浏览器差异:
- IE:固定上限为250MB。
- Chrome/Opera:基于剩余磁盘空间的百分比(通常为剩余空间的20%,但具体比例可能因浏览器版本而异)。
- Firefox:无硬性上限,但受浏览器全局存储配额限制(通常为硬盘可用空间的50%,且每个主域名组最多占用20%)。
- 移动端:部分浏览器可能限制IndexedDB的存储上限为5MB(与localStorage相同)。
- 全局与组配额:
- 全局限制:浏览器总存储空间通常为硬盘可用空间的50%(如500GB硬盘最多存储250GB)。
- 组限制:每个主域名(如
example.com)及其子域名(如www.example.com)共享一个存储组,最多占用全局限制的20%(如250GB的20%为50GB),但最少不低于10MB、最多不超过2GB。
- 超出限制的行为:
- 若存储操作超出源的配额,浏览器会抛出
QuotaExceededError异常。 - 若浏览器全局存储空间已满,会自动删除部分网站的数据(整个网站的数据会被清空,而非部分数据)以腾出空间。
- 若存储操作超出源的配额,浏览器会抛出
3. 关键对比与建议
| 特性 | localStorage | IndexedDB |
|---|---|---|
| 存储上限 | 统一5MB(同一源) | 浏览器差异大(IE 250MB,Chrome/剩余空间百分比,Firefox无硬上限) |
| 数据类型 | 仅支持字符串(需手动序列化复杂数据) | 支持JavaScript对象、二进制数据(ArrayBuffer、Blob) |
| 超出限制的行为 | 直接抛出QuotaExceededError |
抛出QuotaExceededError或自动清理数据 |
| 适用场景 | 简单键值对存储(如用户偏好设置) | 大型应用状态、离线数据、媒体资源存储 |
4. 开发建议
- 检测存储空间:使用
navigator.storage.estimate()方法获取当前源的预估已用空间和可用空间,避免盲目写入导致异常。navigator.storage.estimate().then(estimate => { console.log(`已用空间: ${estimate.usage} bytes, 可用空间: ${estimate.quota - estimate.usage} bytes`); }); - 异常处理:用
try...catch包裹存储操作代码,捕获QuotaExceededError异常并提示用户清理缓存。try { const request = indexedDB.open('myDB', 1); request.onsuccess = () => { const db = request.result; // 执行存储操作... }; } catch (e) { if (e.name === 'QuotaExceededError') { alert('本地空间不足,请清理浏览器缓存后重试。'); } } - 选择存储方案:
- 若需存储少量简单数据(如Token、用户设置),优先使用localStorage。
- 若需存储大量结构化数据或二进制资源(如图片、视频),选择IndexedDB。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)