Web前端入门第 83 问:JavaScript localStorage 有大小限制吗?溢出会怎样?
本地存储除了 Cookie 外,还有 localStorage 和 sessionStorage,本文一探 localStorage。
localStorage
此 API 存入的数据会 永久 保存在浏览器中,除非用户手动删除。
localStorage 能用于同一浏览器同一域名跨标签页通信。
同一浏览器无痕模式和非无痕模式下,localStorage 存储的数据无法互通,且无痕模式存入的数据在浏览器关闭时候会被清除(所有无痕模式窗口关闭也会清除)!!
API
localStorage 对象暴露的 API 很简单,就几个增删改操作方法:
// 只读属性,返回本地存储项的数目
localStorage.length
// 获取本地存储的第 n 个键名
localStorage.key(n)
// 获取本地存储的值
localStorage.getItem(key)
// 写入本地存储
localStorage.setItem(key, value)
// 删除本地存储
localStorage.removeItem(key)
// 清空所有本地存储
localStorage.clear()
示例:
(() => {
// 监听 storage 事件
window.addEventListener('storage', e => {
// 本页面不会触发 storage 事件
// 需要新开一个 tab 查看变化
console.log(e);
})
// 写入数据
localStorage.setItem('type', '公众号');
localStorage.setItem('name', '前端路引');
// 获取本地存储长度
console.log(localStorage.length);
// 循环打印本地存储
for (let i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i);
const value = localStorage.getItem(key);
console.log(`${key}: ${value}`);
}
// 移除单个本地存储
localStorage.removeItem('name');
// 移除所有本地存储
localStorage.clear();
})()
以上代码中的 storage 事件只会在有多个标签页打开的情况下,才会触发;只有一个窗口时, localStorage 的改变并不会触发 storage 事件。
MDN 中有这么一句话:

原文:https://developer.mozilla.org/zh-CN/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API
上面代码执行结果:

如果要想在当前页页能触发 storage 事件,可以派发一个模拟事件:
(() => {
// 移除所有本地存储
localStorage.clear();
// 监听 storage 事件
window.addEventListener('storage', e => {
console.log(e);
})
// 自定义写入函数,封装事件派发
function setItem (key, value) {
// 模拟 storage 事件
const ev = new StorageEvent('storage', {
key,
newValue: value,
oldValue: localStorage.getItem(key),
url: location.href,
});
window.dispatchEvent(ev);
localStorage.setItem(key, value);
}
setItem('type', '公众号');
setItem('name', '前端路引');
})()
执行结果:

功能检测
此处分享一个 MDN 文档中的检测 localStorage 是否可用的代码片段:

来源:https://developer.mozilla.org/zh-CN/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API
大小与个数限制
分享完 API 的使用方式,再看看各个浏览器之间的大小限制。
Chrome
Chrome 浏览器本地存储配额为 5MB 大小,意思就是所有存储的数据(键和值一起的长度)加起来不能超过 5MB。
(() => {
// 移除所有本地存储
localStorage.clear();
const key = 'name';
const max = 5 * 1024 * 1024;
// 测试极限值
const value = 'a'.repeat(max - key.length);
// 测试中文
// const value = '中'.repeat(max - key.length);
// 测试溢出
// const value = 'a'.repeat(max - key.length + 1);
localStorage.setItem(key, value);
})()
以上代码为刚好能存下的长度,如果超出一个字符,将会报错:
Uncaught QuotaExceededError: Failed to execute 'setItem' on 'Storage': Setting the value of '****' exceeded the quota.
错误截图:

Edge
自从 Edge 换成 Chromium 内核之后,它俩的所有行为基本表现一直,以前的 IE 内核没做测试,有兴趣的同学可以测试看看 IE 内核的表现行为。
Firefox
Firefox 也是限制 5MB 大小,但在溢出时的报错不一样:
Uncaught DOMException: The quota has been exceeded.
错误截图:

根据以上测试结果得出:Firefox(138.0.4)、Edge(136.0.3240.92)、Chrome(136.0.7103.114)三大浏览器都是共用 5MB 存储空间,数量与每个本地储存项的大小有关,比如每次写入一个 1MB 的数据,那么就支持写入 5 个!!
中英文:与 Cookie 不同,localStorage 中的中文和英文计算方式一致,一个中文也按照一个字符计算!!
写在最后
localStorage 仅支持字符串存储,所以在存储 JS 的 JSON 数据时,需要将 JSON 数据转为字符串再存储。
由于本人是 windows 环境,所以无法测试 Safari 浏览器的具体情况,有兴趣可以自测一下(有网友测试 safari 13.0.2 限制 2.5MB)。
在移动端的浏览器和 Webview 中使用 localStorage 时需注意,由于 APP 会自动优化存储空间,写在本地存储中的数据随时都可能被清空删除,所以本地存储的数据是不可靠的。
Web前端入门第 83 问:JavaScript localStorage 有大小限制吗?溢出会怎样?的更多相关文章
- web前端入坑第五篇:秒懂Vuejs、Angular、React原理和前端发展历史
秒懂Vuejs.Angular.React原理和前端发展历史 2017-04-07 小北哥哥 前端你别闹 今天来说说 "前端发展历史和框架" 「前端程序发展的历史」 「 不学自知, ...
- web前端入坑第二篇:web前端到底怎么学?干货资料! 【转】
http://blog.csdn.net/xllily_11/article/details/52145172 版权声明:本文为博主[小北]原创文章,如要转载请评论回复.个人前端公众号:前端你别闹,J ...
- web前端(13)—— 了解JavaScript,JavaScript的引入方式
从本篇博文开始,将进入web前端方便最关键最重要的部分——javascript,学到后面你就知道它真的太重要了 什么是JavaScript JavaScript一种直译式的脚本语言,是一种动态类型.弱 ...
- WEB前端工程师整理的原生JavaScript经典百例
一.原生JavaScript实现字符串长度截取 二.原生JavaScript获取域名主机 三.原生JavaScript转义html标签 四.原生JavaScript时间日期格式替换 Date.prot ...
- Web前端基础怎么学? JavaScript、html、css知识架构图
以前开发者只要掌握 HTML.CSS.JavaScript 三驾马车就能胜任一份前端的工作了.而现在除了普通的编码以外,还要考虑如何性能优化,如何跨端.跨平台实现功能,尤其是 AI.5G 技术的来临, ...
- web前端学习之HTML CSS/javascript之一
前端编码之路之坎坷,web前端应该一直是个战场吧,各种浏览器的不兼容,各种小细节的修改,要往一个好的产品经理方向走,实在是难,昨天听了一位十年经验的产品经理讲座,最重要的恐怕就是协调资源的能力,而协调 ...
- Android零基础入门第83节:Activity间数据传递方法汇总
在Activity间传递的数据一般比较简单,但是有时候实际开发中也会传一些比较复杂的数据,本节一起来学习更多Activity间数据的传递. 一.常用数据类型 在前面几节我们只学习了一些常用类型的数据传 ...
- Web前端开发规范【HTML/JavaScript/CSS】
前言 这是一份旨在增强团队的开发协作,提高代码质量和打造开发基石的编码风格规范,其中包含了 HTML, JavaScript 和 CSS/SCSS 这几个部分.我们知道,当一个团队开始指定并实行编码规 ...
- web前端——实例中学习css,javascript
最近闲暇时候在研究前端的样式和js,以前都是从w3school上看看那些选择器和DOM操作方法很少去实际做demo来研究,做的过程当中才真切感觉到纸上得来终觉浅,看得懂跟能做出东西完全两码事,尤其在定 ...
- 文成小盆友python-num14 - web 前端基础 html ,css, JavaScript
本部分主要内容 html - 基础 css - 基础 一.html 标签 html 文档标签树如下: head 部分 Meta(metadata information) 提供有关页面的元信息,例:页 ...
随机推荐
- 从实际的编程示例中看i++与++i的区别
举一个简单的例子,我们希望给一个长字符串出现的每个字符的数量进行打表 这里给出部分代码 String p; HashMap<Character,Integer> map =new Hash ...
- JVM 使用mat分析Dump文件排查大对象解决系统full GC问题
摘要:介绍内存分析工具Mat查找大对象的使用方法,定位full GC根源,拉升系统吞吐量,避免内存泄漏. 引言 线上服务器频繁发生full GC,直接拉低系统吞吐量,甚至OOM.今天我们来一起学习 ...
- Go标准库Cond
Go标准库的Cond Go 标准库提供 Cond 原语的目的是,为等待 / 通知场景下的并发问题提供支持.Cond 通常应用于等待某个条件的一组 goroutine,等条件变为 true 的时候,其中 ...
- java练习题之String字符串
1 编写程序将"jdk" 全部变成大写 并输出到屏幕 截取"DK"并输出到屏幕 1 package com.lv.study.am.first; 2 3 pu ...
- MySQL技术内幕 InnoDB存储引擎 B+树索引的使用 笔记
什么时候添加B+树索引呢? 在访问表中很少一部分时使用B+树索引才有意义. Q: 怎么查看索引是否是高选择性的呢? A:可以通过SHOW INDEX 结果中的列 Cardinality 来观察.Car ...
- Vue <img :src=""/> 图片不显示
场景 图片路径被原样输出,无法正确加载图片: <img :src="imgSrc"/> 原因 webpack 会将:src 动态绑定的值解析成字符串,原样输出: 解决办 ...
- 【闲话 No.2】 长链剖分
壱雫空 本来打算省选游记推这首歌的,但是省选破大防了,最后他来到了这里.感觉拿这个当起床铃效果一定很好(关键这歌超好听的!). もしこの雨が上がっても 忘れずに歩いてくよ 最初のひとしずくに 顔上げた ...
- 利用解析差异复活某凌OA前台RCE
前言 23年底网上公开了一个某凌OA前台RCE,接口为/sys/ui/sys_ui_component/sysUiComponent.do这个漏洞是文件解压以后复制到WEB目录导致的任意文件写入,接口 ...
- Kong入门学习实践(7)灰度发布与蓝绿部署
两年前,我在学习K8s的时候有写过一篇基于Nginx Ingress实现灰度发布的博文.这次,我们基于Kong来实践一下.灰度发布的具体实现其实是流量切分,那就让我们先回顾一下流量切分的实现方式. 流 ...
- sqlserver 修改安装时候的目录路径-Sql server 安装目录修改
https://blog.csdn.net/qq_25049941/article/details/90401210?utm_medium=distribute.pc_aggpage_search_r ...