本地存储除了 Cookie 外,还有 localStoragesessionStorage,本文一探 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 有大小限制吗?溢出会怎样?的更多相关文章

  1. web前端入坑第五篇:秒懂Vuejs、Angular、React原理和前端发展历史

    秒懂Vuejs.Angular.React原理和前端发展历史 2017-04-07 小北哥哥 前端你别闹 今天来说说 "前端发展历史和框架" 「前端程序发展的历史」 「 不学自知, ...

  2. web前端入坑第二篇:web前端到底怎么学?干货资料! 【转】

    http://blog.csdn.net/xllily_11/article/details/52145172 版权声明:本文为博主[小北]原创文章,如要转载请评论回复.个人前端公众号:前端你别闹,J ...

  3. web前端(13)—— 了解JavaScript,JavaScript的引入方式

    从本篇博文开始,将进入web前端方便最关键最重要的部分——javascript,学到后面你就知道它真的太重要了 什么是JavaScript JavaScript一种直译式的脚本语言,是一种动态类型.弱 ...

  4. WEB前端工程师整理的原生JavaScript经典百例

    一.原生JavaScript实现字符串长度截取 二.原生JavaScript获取域名主机 三.原生JavaScript转义html标签 四.原生JavaScript时间日期格式替换 Date.prot ...

  5. Web前端基础怎么学? JavaScript、html、css知识架构图

    以前开发者只要掌握 HTML.CSS.JavaScript 三驾马车就能胜任一份前端的工作了.而现在除了普通的编码以外,还要考虑如何性能优化,如何跨端.跨平台实现功能,尤其是 AI.5G 技术的来临, ...

  6. web前端学习之HTML CSS/javascript之一

    前端编码之路之坎坷,web前端应该一直是个战场吧,各种浏览器的不兼容,各种小细节的修改,要往一个好的产品经理方向走,实在是难,昨天听了一位十年经验的产品经理讲座,最重要的恐怕就是协调资源的能力,而协调 ...

  7. Android零基础入门第83节:Activity间数据传递方法汇总

    在Activity间传递的数据一般比较简单,但是有时候实际开发中也会传一些比较复杂的数据,本节一起来学习更多Activity间数据的传递. 一.常用数据类型 在前面几节我们只学习了一些常用类型的数据传 ...

  8. Web前端开发规范【HTML/JavaScript/CSS】

    前言 这是一份旨在增强团队的开发协作,提高代码质量和打造开发基石的编码风格规范,其中包含了 HTML, JavaScript 和 CSS/SCSS 这几个部分.我们知道,当一个团队开始指定并实行编码规 ...

  9. web前端——实例中学习css,javascript

    最近闲暇时候在研究前端的样式和js,以前都是从w3school上看看那些选择器和DOM操作方法很少去实际做demo来研究,做的过程当中才真切感觉到纸上得来终觉浅,看得懂跟能做出东西完全两码事,尤其在定 ...

  10. 文成小盆友python-num14 - web 前端基础 html ,css, JavaScript

    本部分主要内容 html - 基础 css - 基础 一.html 标签 html 文档标签树如下: head 部分 Meta(metadata information) 提供有关页面的元信息,例:页 ...

随机推荐

  1. CentOS 7 系统调优深度指南

    从内核参数.资源分配.存储性能到网络优化,覆盖全维度调优策略,并强调稳定性保障. 一.调优核心维度与操作命令 1. 内核参数调优 (/etc/sysctl.conf) bash # 编辑配置文件 vi ...

  2. `.NC`文件的读取与使用

    .NC文件的读取与使用 前言 NetCDF(network Common Data Form)网络通用数据格式是一种面向数组型并适于网络共享的数据的描述和编码标准.目前,NetCDF广泛应用于大气科学 ...

  3. 为什么构建容器需要Namespace?

    1.什么是Namespace? Namespace 是 Linux 内核的一个特性,该特性可以实现在同一主机系统中,对进程 ID.主机名.用户 ID.文件名.网络和进程间通信等资源的隔离.Docker ...

  4. Arduino 74HC164 数显屏幕显示简单程序

    根据卖家的代码,翻译成arduino语言就是这样了,废话少说直接放函数 接口:DAT------11号数字输出接口 CLK------12号数字输出接口 代码在下面: typedef unsigned ...

  5. Vue3中使用TinyMce编辑器

    Vue3中使用TinyMce编辑器 - 知乎 一,安装TinyMce富文本vue npm install @tinymce/tinymce-vue -S npm install tinymce -ST ...

  6. C# 获取字符串 字节的长度

    https://www.cnblogs.com/xiarongrong/p/5168713.html /// <summary>        /// 获取字符串字节长度        / ...

  7. C# 使用Newtonsoft.Json

    https://blog.csdn.net/qq_38762313/article/details/100161149 对象转json字符串 string jsStr=Newtonsoft.Json. ...

  8. java GC 回收

    简介 参考链接 https://blog.csdn.net/zzhongcy/article/details/101429388

  9. SciTech-Mathmatics-ProbabilitiesAndStatistics-Distribution-is-all-you-need: 概率统计到深度学习

    Distribution-is-all-you-need 概率统计到深度学习,四大技术路线图谱,都在这里! https://github.com/graykode/distribution-is-al ...

  10. SIP REG Digest认证算法分析

    一.回顾SIP Register的认证过程 Client(通常是话机)向REG Server(一般是OpenSIPS或Freeswitch)发起REGISTER注册请求(注:此时发送的请求里,只有一些 ...