范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

localStorage灵魂五问。5M??10M

  灵魂五问 localStorage 存储的键值采用什么字符编码 5M 的单位是什么 localStorage 键占不占存储空间 localStorage的键的数量,对写和读性能的影响 写个方法统计一个localStorage已使用空间
  我们挨个解答,之后给各位面试官又多了一个面试题。
  我们常说localStorage存储空间是5M,请问这个5M的单位是什么? localStorage 存储的键值采用什么字符编码?
  打开相对权威的MDN  localStorage#description[1]
  The keys and the values stored with  localStorage  are always in the UTF-16 DOMString [2]  format, which uses two bytes per character. As with objects, integer keys are automatically converted to strings.
  翻译成中文:
  localStorage 存储的键和值始终采用 UTF-16 DOMString 格式,每个字符使用两个字节。与对象一样,整数键将自动转换为字符串。
  答案:UTF-16
  MDN这里描述的没有问题,也有问题,因为UTF-16,每个字符使用两个字节,是有前提条件的,就是码点小于 0xFFFF (65535), 大于这个码点的是四个字节。
  这是全文的关键。 5M 的单位是什么
  5M的单位是什么?
  选项: 字符的个数 字节数 字符的长度值 bit 数 utf-16编码单元
  以前不知道,现代浏览器,准确的应该是  选项3,字符的长度  ,亦或  选项5, utf-16编码单元
  字符的个数,并不等于字符的长度,这一点要知道: "a".length // 1 "人".length // 1 "".length // 2 "".length // 2
  现代浏览器对字符串的处理是基于UTF-16  DOMString[2] 。
  但是说5M字符串的长度,显然有那么点怪异。
  而根据 UTF-16编码规则,要么2个字节,要么四个字节, 所以不如说是 10M 的字节数,更为合理。
  当然,2个字节作为一个utf-16的字符编码单元,也可以说是 5M 的utf-16的编码单元。
  我们先编写一个utf-16字符串计算字节数的方法:非常简单,判断码点决定是2还是4 function sizeofUtf16Bytes(str) {     var total = 0,         charCode,         i,         len;     for (i = 0, len = str.length; i < len; i++) {         charCode = str.charCodeAt(i);         if (charCode <= 0xffff) {             total += 2;         } else {             total += 4;         }     }     return total; }
  我们再根绝10M的字节数来存储
  我们留下8个字节数作为key,8个字节可是普通的4个字符换,也可是码点大于65535的3个字符,也可是是组合。
  下面的三个组合,都是可以的, aaaa aa
  在此基础上增加任意一个字符,都会报错异常异常。 const charTxt = "人"; let count = (10 * 1024 * 1024 / 2) - 8 / 2; let content = new Array(count).fill(charTxt).join(""); const key = "aa"; localStorage.clear(); try {     localStorage.setItem(key, content); } catch (err) {     console.log("err", err); }  const sizeKey = sizeofUtf16Bytes(key); const contentSize = sizeofUtf16Bytes(content); console.log("key size:", sizeKey, content.length); console.log("content size:", contentSize, content.length); console.log("total size:", sizeKey + contentSize, content.length + key.length);
  现代浏览器的情况下:
  所以,说是10M的字节数,更为准确,也更容易让人理解。
  如果说5M,那其单位就是字符串的长度,而不是字符数。
  答案:字符串的长度值, 或者utf-16的编码单元
  更合理的答案是 10M字节空间。 localStorage 键占不占存储空间
  我们把 key和val各自设置长 2.5M的长度 const charTxt = "a"; let count = (2.5 * 1024 * 1024); let content = new Array(count).fill(charTxt).join(""); const key = new Array(count).fill(charTxt).join(""); localStorage.clear(); try {     console.time("setItem")     localStorage.setItem(key, content);     console.timeEnd("setItem") } catch (err) {     console.log("err code:", err.code);     console.log("err message:", err.message) }
  执行正常。
  我们把content的长度加 1 , 变为 2.5 M + 1 , key的长度依旧是 2.5M 的长度const charTxt = "a"; let count = (2.5 * 1024 * 1024); let content = new Array(count).fill(charTxt).join("") + 1; const key = new Array(count).fill(charTxt).join(""); localStorage.clear(); try {     console.time("setItem")     localStorage.setItem(key, content);     console.timeEnd("setItem") } catch (err) {     console.log("err code:", err.code);     console.log("err message:", err.message) }
  产生异常,存储失败。至于更多异常详情吗,参见  localstorage_功能检测[3] :function storageAvailable(type) {     var storage;     try {         storage = window[type];         var x = "__storage_test__";         storage.setItem(x, x);         storage.removeItem(x);         return true;     }     catch(e) {         return e instanceof DOMException && (             // everything except Firefox             e.code === 22 ||             // Firefox             e.code === 1014 ||             // test name field too, because code might not be present             // everything except Firefox             e.name === "QuotaExceededError" ||             // Firefox             e.name === "NS_ERROR_DOM_QUOTA_REACHED") &&             // acknowledge QuotaExceededError only if there"s something already stored             (storage && storage.length !== 0);     } }
  答案: 占空间 键的数量,对读写的影响
  我们 500 * 1000 键,如下let keyCount = 500 * 1000;  localStorage.clear(); for (let i = 0; i < keyCount; i++) {     localStorage.setItem(i, ""); }  setTimeout(() => {     console.time("save_cost");     localStorage.setItem("a", "1");     console.timeEnd("save_cost"); }, 2000)   setTimeout(() => {     console.time("read_cost");     localStorage.getItem("a");     console.timeEnd("read_cost");  }, 2000)  // save_cost: 0.05615234375 ms // read_cost: 0.008056640625 ms
  你单独执行保存代码: localStorage.clear();     console.time("save_cost"); localStorage.setItem("a", "1"); console.timeEnd("save_cost"); // save_cost: 0.033203125 ms
  可以多次测试, 影响肯定是有的,也仅仅是数倍,不是特别的大。
  反过来,如果是保存的值表较大呢? const charTxt = "a"; const count = 5 * 1024 * 1024  - 1 const val1 = new Array(count).fill(charTxt).join("");  setTimeout(() =>{     localStorage.clear();     console.time("save_cost_1");     localStorage.setItem("a", val1);     console.timeEnd("save_cost_1"); },1000)   setTimeout(() =>{     localStorage.clear();     console.time("save_cost_2");     localStorage.setItem("a", "a");     console.timeEnd("save_cost_2"); },1000)  // save_cost_1: 12.276123046875 ms // save_cost_2: 0.010009765625 ms
  可以多测试很多次,单次值的大小对存的性能影响非常大,读取也一样,合情合理之中。
  所以尽量不要保存大的值,因为其是同步读取,纯大数据,用indexedDB就好。
  答案:键的数量对读取性能有影响,但是不大。值的大小对性能影响更大,不建议保存大的数据。 写个方法统计一个localStorage已使用空间
  现代浏览器的精写版本: function sieOfLS() {     return Object.entries(localStorage).map(v => v.join("")).join("").length; }
  测试代码: localStorage.clear(); localStorage.setItem("", 1); localStorage.setItem("", 1111); console.log("size:", sieOfLS())   // 23 // *9 + 1 *5 = 2*9 + 1*5 = 23 html的协议标准
  WHATWG 超文本应用程序技术工作组 的 localstorage[4]  协议定了localStorage的方法,属性等等,并没有明确规定其存储空间。也就导致各个浏览器的最大限制不一样。
  其并不是ES的标准。 页面的utf-8编码
  我们的html页面,经常会出现  。告知浏览器此页面属于什么字符编码格式,下一步浏览器做好解码工作。                    容器 
  这和localStorage的存储没有半毛钱的关系。 localStorage扩容
  localStorage的空间是 10M的字节数,一般情况是够用,可是人总是有贪欲。真达到了空间限制,怎么弄?
  localStorage扩容就是一个话题。

快递按下暂停键后自从山西清徐韵达快递园发现员工集体大面积感染后,政府紧急叫停了所有快递业务,并对各地从事快递业务的各个链条成员做了核酸检测,有的居家隔离,有的集体隔离,现在的快递业务可谓是风雨飘摇北京抢菜与上海不同?快递放狠话给谁听?近日网上北京抢菜沸沸扬扬,其实作为首都,物资供应结局有悬念吗?网传京东的CEO网上放狠话?禁不住好奇是讲给上海听吗?一抢购北京出现多例奥密克戎病例,有上海的教训在,大家都开始了抢菜又一个特斯拉Model3竞争对手,华为技术加持,哪吒S能脱颖而出吗新车迷原创很多新能源车把特斯拉Model3拿来当竞争对手,这无可厚非,毕竟特斯拉Model3在销量上是非常成功的,不管是国内还是国外的媒体,经常拿它来对比。就像我们谈到7座中型SU售价568元!苹果上架智能保温杯,自带RGB灯提醒喝水一直以来,苹果的产品价格就十分昂贵,之前一块布苹果就卖到了离谱的145元,而在最近,苹果商店上架了一款HidrateSparkSTEEL智能保温杯,虽然不是苹果生产的,但不出意料这新品上市TK二代小马座系列单目手持红外望远镜,六款型号齐发即刻,清晰TK二代小马座系列颠覆,为高清体验而来新一代自研红外探测器PureIR自适应动态滤波算法强强联合,400x300640x480两种分辨率红外探测器可选,搭配智能3D降噪和苹果官网上架HidrateSparkSTEEL智能保温杯,售价568元IT之家4月26日消息,苹果官网今日上架了一款售价568元的HidrateSparkSTEEL智能水瓶,已正式开售。这款HidrateSparkSTEEL智能水瓶拥有银色黑色两款配国产芯片日产10亿颗,张忠谋发话反对我国自主研发,你怎么看?引言众所周知,芯片技术是一项非常重要的高新技术,芯片的运用范围十分广泛,这种高端技术也被美国为首的发达国家垄断。我国的芯片技术还不成熟,是我们技术领域的短板。所以美国也经常抓住我们iPhone6s即将停更,iPhoneSE3或为最强接替者,依旧可战七年如果说苹果最经典的机型都有哪些?iPhone6s肯定首当其冲。这部手机在2015年发布,至今已经7年时间,还可以更新到最新的iOS15。5PublicBeta2,而且用户规模依旧很火力全开!比亚迪海洋网首款中型车,特斯拉Model3最强敌手车矩阵车评用如日中天来形容当下的比亚迪最为合适不过,继3月官宣停产燃油车以来,混动以及纯电车型的火爆热销结结实实地给一些裹足不前的传统车企上了一课,产品矩阵越来越丰富,渠道更是扩张华为MateXs2折叠旗舰再预热更轻更平,定价或高达一万七华为MateXs2折叠旗舰及全场景新品发布会将于4月28日举行,今天官方再次对新机预热。尽管折叠手机未来市场空间持续看好,但当前依然面临一些痛点。例如折叠屏手机存在表面易刮伤折痕明中国电信与中国联通联手推出5G新通话服务中证网讯(记者杨洁)4月26日,中国联通中国电信宣布,在深圳杭州郑州天津等城市开通5G新通话超清视频语音通话服务(VoNR)。两家运营商表示,将在5月份开通100个以上主要城市,其
今日区块链资讯1。1月31日消息,全球投资银行高盛(GoldmanSachs)警告称,随着加密货币的普及,比特币越来越容易受到美联储加息的影响。高盛分析师表示,最近几周债券收益率上涨影响了科技股买新手机之前,记住这三个忠告再去问手机销售,让他不敢坑你又要过年换新手机了,很多人买手机都是选择网购,但是还有一部分人会选择去实体店购机。因为他们觉得去手机店买手机,可以摸到真机,买完就可以走了。但是他们不知道的是,手机店里给你推荐的都RedmiK406128GB到手价1789元RedmiK40作为Redmi系列手机中的最新一代,配置出色,颜值在线,手感优秀,性能出众,拥有性价比。目前,RedmiK406GB128GB版本极具性价比,京东报价1799元,券地震仪器的预测预告研发方向在哪?依靠智能高科技现在所有的地震研究工作都集中在了地震的强点所带来的严重破坏上。原因是因为目前的科技水平还没有达到可以提前预告地震的阶段。所以,大家都带着悲观的意向,认为地震是不可预测的,于是把目光自然超粒子技术实现健康新型消毒模式来源人民网雨过天晴后,人们会感到空气清新。这是因为,大自然环境产生的复杂粒子释放到空气中发生系列链式反应,达到杀菌消毒清除有害气体等功效,净化了空气。如何利用大自然这一智慧,在疫情山东高考每日一专业智能电网信息工程1。专业背景本专业为2011年新增专业,旨在培养具有良好的科学素质和文化修养,扎实的专业理论和专业技能,受到卓越工程师高级训练,掌握智能电网相关的理论知识,在新能源发电与智能接入技从应用场景看5G发展有部分人抱怨5G的发展未达预期,认为5G技术没有说的那么好,个人认为这是误解,是不了解5G技术实际的表现。要认识5G,必须从其定位入手,从其应用场景入手。5G是主要为万物智联的物联百公里油耗2。1L,零百加速6。7秒,适时四驱,体验奥迪A6LPHEV在乘用车市场,随着新能源汽车的渗透率越来越高,各品牌都加速了在这个领域的布局,豪华品牌BBA也不例外。奥迪A6LPHEV,作为奥迪旗下的插电式混合动力中大型轿车,产品实力如何呢?当Win10免费升级机会即将结束微软暗示Win11后续要花钱升级微软的Win11正式推出已经三个月了,如果从去年6月份官宣算起则是半年多了,为了推广新系统,微软此前奉行的是免费升级策略,Win10等系统可以直接升级,不过今年6月份之后很可能就要微信又更新了!这次是朋友圈来源新华网微信又更新了!iOS微信发布了8。0。18版本更新其中一项新增功能格外引人关注微信发朋友圈现在可以支持选择20张图片!在之前朋友圈图片一次最多只能发9张本次更新后发朋友圈离职创业,一夜身价590亿,前滴滴高管汪莹的故事远比你想的精彩文老赵戏说编辑老赵戏说如今我们身在一个任何人都有可能跨越阶层的时代,汪莹就是其中成功的一位,她仅用三年时间就让一家创业公司在美成功上市,自己的身价也暴涨至590亿。一时间汪莹的名字