幼儿饰品瑜伽美体用品微软
投稿投诉
微软创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品

译通过内存快照看WeakMap与三个典型应用?

  自2015年6月ES2015发布以来已经过去了很多年。在撰写之前的每周精选时,我在想是否有我没有使用到的ES2015语法,例如Proxy或Reflect?,首先想到的是WeakMap和WeakSet。因为我对弱引用这个话题比较感兴趣,所以就着这个话题我准备写一篇WeakMap的文章来带着大家一起来了解下它。1。什么是WeakMap?
  WeakMap对象是键值对的集合,其中的键被弱引用。键必须是对象,原始值不能是键。如果你添加一个原始值作为键,你会得到一个错误:UncaughtTypeError:Invalidvalueusedasweakmapkey。
  WeakMap提供了一种检查特定键是否有值的方法,但它没有提供枚举键对象的方法。众所周知,在WeakMap中用作键的对象需要进行垃圾回收。如果除WeakMap外,程序中不存在对对象的引用,则该对象将被垃圾回收。假设有一个使用闭包返回长数组的函数,如下所示:refs:https:developer。chrome。comdocsdevtoolsmemoryproblemsheapsnapshotsfunctioncreateLargeClosure(){constlargeStrnewArray(1000000)。join(x);constlcfunctionlargeClosure(){returnlargeStr;};returnlc;}
  首先,使用Map创建一个内存泄漏示例:constmapnewMap();functionstart(){consttimersetInterval((){constlccreateLargeClosure();函数map。set(lc,);},1000);setTimeout(function(){clearInterval(timer);},5001);}
  使用DevTools检查内存分配状态:
  现在,如果用newWeakMap()而不是newMap()替换集合对象后运行相同的代码,可以看到内存被释放。
  如果您因为不熟悉DevTools而对这个快照不熟悉,建议您观看ChromeDevTools详解或阅读Chrome文档,统一提供在参考文献中。2。WeakMap构造函数的特点WeakMap是全局对象的一个属性不能作为通用函数调用,作为通用函数调用时会报错必须使用new关键字调用构造函数。它有一个内部插槽〔〔Prototype〕〕,它的值是Function。prototypeWeakMap。prototype。constructor。protoFunction。prototype;它可以通过extends关键字用于继承。3。WeakMap方法
  WeakMap只提供四种方法,下面会讲到。如前所述,不支持枚举键相关的方法。根据ECMAScript规范,WeakMap的实现在键值对变得不可访问和键值对从WeakMap中删除之间可能会有延迟。因此,无法执行涉及枚举整个键值对的操作。3。1WeakMap。prototype。delete(key)
  删除映射到键的所有值,WeakMap。prototype。has(key)之后会返回false。3。2WeakMap。prototype。get(key)
  返回映射到key的值,如果没有映射值则返回未定义。3。3WeakMap。prototype。has(key)
  返回一个布尔值,表示映射到WeakMap实例对象中的键的值是否存在。3。4WeakMap。prototype。set(key,value)
  在WeakMap实例对象中设置映射到key的值(value),返回WeakMap实例对象。3。5WeakMap。prototype。clear()
  由于安全问题,除了IE之外的所有浏览器都弃用了clear()方法。当前版本或者起草中没有这个方法,这个方法在版本28(2014年10月14)之前是ECMAScript6起草规范的一部分,但是在起草之后的版本中被移除了。它不在是最终标准的一部分了。4。WeakMap示例
  WeakMap的简单介绍到此结束,接下来看几个例子熟悉下如何使用它。通常,WeakMap用于容易发生内存泄漏的代码。4。1Caching(缓存)
  WeakMap有助于数据存储(memoization),数据存储(memoization)是一种缓存昂贵计算的结果并在接收到相同输入值时返回缓存结果的技术。functioncreateLargeClosure(){constlargeObj{a:1,b:2,str:newArray(1000000)。join(x),};constlcfunctionlargeClosure(){returnlargeObj;};returnlc;}constmemonewWeakMap();functionmemoize(obj){if(memo。has(obj)){console。log(Getcachedresult);returnmemo。get(obj);}constcomputeobj。aobj。b;console。log(Setcomputedresulttocachingmap);memo。set(obj,compute);returncompute;}functionstart(){constlcObjcreateLargeClosure();返回一个函数consttimersetInterval((){memoize(lcObj());返回大对象作为key},1000);setTimeout(function(){clearInterval(timer);},5001);清除定时器不再持有对key的引用}
  如果使用Map创建memo,则使用DevTools检查的内存分配状态如下:
  如果将缓存对象从Map更改为WeakMap,可以看到上图中的对象已被删除,并且随着内存被释放,上面条形图中的蓝色量表略有下降。
  4。2自定义事件
  在某些项目中,通常需要自定义事件对象。有一种方法可以将事件对象混合到实例中,例如TOASTUI的代码片段(查看参考资料)。但是,如果您只是将事件对象实现为单例,WeakMap可以用于解决内存泄漏。以下代码注册了一个以targetObject为键的事件处理程序并执行它:classEventEmitter{constructor(){this。targetsnewWeakMap();}on(targetObject,handlers){if(!this。targets。has(targetObject)){this。targets。set(targetObject,{});}consttargetHandlersthis。targets。get(targetObject);Object。keys(handlers)。forEach((handlerName){targetHandlers〔handlerName〕targetHandlers〔handlerName〕〔〕;targetHandlers〔handlerName〕。push(handlers〔handlerName〕。bind(targetObject));});}fire(targetObject,handlerName,args){consttargetHandlersthis。targets。get(targetObject);if(targetHandlerstargetHandlers〔handlerName〕){targetHandlers〔handlerName〕。forEach((handler)handler(args));}}}
  当执行下面的代码时,user和handlers对象的内存会自动被垃圾收集器收集,因为user在WeakMap中注册为键。constemitternewEventEmitter();functionstart(){constuser{name:John,};consthandlers{sayHello:function(){console。log(Hello,mynameis{this。name});},sayGoodBye:function(){console。log(Goodbye,mynameis{this。name});},};emitter。on(user,handlers);以对象为keyconsttimersetInterval((){emitter。fire(user,sayHello);emitter。fire(user,sayGoodBye);},1000);清除定时器setTimeout(function(){clearInterval(timer);},5001);}
  下图展示了用Map实现EventEmitter时,user和handlers没有被收集的情况。
  如果使用WeakMap,我们可以看到对象已被垃圾收集器收集。
  4。3私有属性
  私有属性可以很容易地在Babel的转译结果中找到,以下代码使用关键字指定访问修饰符。classA{privateFieldA1;privateFieldBA;}
  下面显示了转译后的实际结果。您可以在Babel的Tryitout(链接)中测试此代码。usestrict;varprivateFieldAPUREnewWeakMap();varprivateFieldBPUREnewWeakMap();classA{constructor(){privateFieldA。set(this,{writable:true,value:1,});privateFieldB。set(this,{writable:true,value:A,});}}
  私有字段使用WeakMap的原因如下:在信息隐藏方面,只有当您知道WeakMap实例和类A的实例时,才可以使用一个值在防止内存泄漏方面,如果A类的实例引用除了WeakMap实例外不存在,则自动回收内存5。总结
  综上所述,WeakMap是一种通过保留弱引用而在内存泄漏管理方面具有优势的数据结构,尽管它不支持像Map那样提供枚举的方法。
  除了用于Vue3响应式之外,WeakMap还用于如何在lodash中使用。memoize的示例,这表明可以将缓存对象更改为WeakMap。它还用于填充私有访问修饰符以隐藏信息。
  诚然,现在大部分项目都是基于框架实现的,一般情况下不会经常用到WeakMap。但是,如果您需要一个以项目中的对象作为标识符的数据结构,您可能需要考虑在使用常规对象或Map之前使用WeakMap。参考资料
  https:toastui。medium。comletsfindoutaboutweakmap2150905935d1
  https:youtu。becAIo4dEEPuc?t1667https:developer。chrome。comdocsdevtoolsmemoryproblemsheapsnapshots
  https:exploringjs。comes6chclasses。htmlsecprivatedataviaweakmaps
  https:babeljs。iorepl
  https:github。comnhntui。codesnippetblobmastercustomEventscustomEvents。js

夏季来临前常喝这3种水,感冒少眼睛亮人也不爱生闷气了,太养人花者,华也,本草之精华。中药花茶品种繁多,功效不尽相同,春季有哪几款花茶最值得喝?江苏省中西医结合医院副主任中药师何丹丹向大家推荐爱生闷气玫瑰花茶玫瑰花……VR显示面板将破千万块,OLED为何缺席?随着VR硬件设备出货量的增加,VR显示面板市场规模快速增长。近日,显示行业供应链研究咨询机构DSCC发布了最新报告,用于虚拟现实(VR)的显示面板的出货量将在2022年首次达到……新短节目亮相,羽生结弦奠定北京冬奥大热门基础羽生在全日锦标赛的短节目中拿到111。31分,离世界纪录仅差0。51分。但是就得分的问题而言,国内赛的分数是不被国际滑联承认的,而且一般情况下国内赛打分比起被国际滑联承认的国际……不造车的华为发布新车,背后是利益博弈,也是鸿蒙的一次机会12月23日的华为冬季旗舰产品发布会,压轴的不是备受期待的P50Pocket折叠屏手机、更不是华为智能眼镜、WATCHD智能手表等电子消费品,而是两辆号称按照百万豪车的标准设计……秋日走进香零山来源:人民网人民日报海外版香零山风光。来自网络秋日,走进香零山村,绿树翠竹掩映,好一片恬静安详的怡人世界,桑榆飘香,溪流纵横。香零山位于湖南永州市零陵区茆江桥……极乐世界之星2号,用来做墓葬的卫星你见过吗?人死了之后上天堂?太空殡葬为您服务!近日,参与北斗系统设计的科学家徐颖在一场科普讲座提到有一颗卫星叫做极乐世界2号,这颗卫星是用来做太空殡葬服务的,据说,你可以将自己的骨……勒布朗1578,安东尼爆发,湖人轻取火箭,谁留意老詹,提前退3554,半场结束火箭暂时落后湖人19分,我们先来看一下双方球员的半场数据,火箭一方泰特4分4板、伍德8分7板、波特8分6板、格林3分、戈登7分、申京5分3板2断;湖人一方贝兹……焦裕禄长女焦守凤现仍住在旧院子里2019年,河南省兰考县原县委书记焦裕禄获得最美奋斗者个人称号,这时,他已经离开人世55年。在焦裕禄任职期间,他亲民爱民,迎难而上,无私奉献,这些宝贵的精神财富,被后人称……张美娥做10年群演,凭西游降魔篇爆红,从150元涨到3万一天文臻本以63岁高龄初登荧屏,在别人退休的年纪,她却在横店群演界闯出了一片天,甚至自嘲招美的虽然不敢去,但是招丑的敢。她就是星女郎张美娥,更是《西游降魔篇》中荒野四大……雪上加霜?郭艾伦吃技犯被驱逐,会缺席和广东队的元旦大战吗?128109,凭借着全队七人得分上双,辽宁男篮最终以19分的大胜优势兵不血刃击败了福建男篮,拿下比赛的同时,也避免了两连败的发生。随着艾伦、大韩、金金的复出,球队正重新步入正轨……央视面对面丨我不是外人哈萨克斯坦小伙儿鲁斯兰的中国情缘点击查看视频7月25日至30日,第二届中国国际消费品博览会在海南海口举办。这是全国首个以消费精品为主题的国家级展会和亚太地区规模最大的消费精品展。海南国际经济发展局……SpringSecurity认证流程分1。认证流程分析SpringSecurity中默认的一套登录流程是非常完善并且严谨的。但是项目需求非常多样化,很多时候,我们可能还需要对SpringSecinity登录流……
坐稳了,即将开启一次超越我们宇宙的旅行一些稀奇古怪的想法驱使着理论家们相信平行宇宙的存在。坐稳了,接下去我们将开启一次超越我们所在宇宙的旅行,去往宇宙平行的维度。我们不仅会探讨当今流行的多重宇宙我们的宇宙只不……BOYLONDON帽子嘻哈风,点缀别样圣诞节在中国,腊月是个值得关注的一个月,尤其是临近的圣诞节,更是一个狂欢的节日,当天的人们身着各色圣诞装庆祝这天的喜庆。那么怎么样才可以让你在众多服饰打扮中脱颖而出呢?现在在高度同化……零跑C01预售,电动汽车市场性价比搅局者来了在之前对电动汽车的售价认知中,一款中大型的纯电动轿车,即便续航一般,也没太多智能化的配置,单凭这个车的尺寸和所处级别,售价就不能低于25万元。然而当零跑C01(图片)(图片)(……真爱永恒珂兰天生一对打造爱的莫比乌斯环不喜欢钻石的人可以罗列一百条理由,而喜欢钻石的人只用一条理由就足够,即钻石代表爱情的永恒。几乎所有女人都是钻石的拥趸,或许是男女差异,女人们总对爱情抱有更忠贞不渝的坚守,希望能……时尚街拍韩国模特卓绝混搭秀出呛辣个性风【导语】时尚街拍:韩国嫩模卓绝混搭秀出呛辣个性风!韩国嫩模混搭街拍让轻熟女们备受瞩目。帅气牛仔裤搭配皮草显时髦摩登。伊秀服饰网带你看看女生们最钟爱的各种混搭,秀出你的呛辣个性回……街拍黑丝少妇图片大全nbsp黑丝的4大搭配技巧推荐黑丝袜简称黑丝,是女性普遍穿着的一种丝袜。调查显示,70以上的男人关注女性的身体部位是腿,而现在黑丝袜让女性的腿部更加引人注意,更加性感。黑丝袜简称黑丝,是女性普遍穿着的……四川甘孜子午工程二期圆环阵太阳射电成像望远镜设备完成系统集成11月13日上午10时许,四川甘孜州稻城县,国家重大科技基础设施子午工程二期圆环阵太阳射电成像望远镜设备,经过四年的建设完成系统集成,正式进入联调联试阶段。预计将在2023年6……万千少女拥戴的DR钻戒,到底有什么魅力?最近上海的情侣估计要哭了,因为最浪漫、最幽静的约会圣地,红坊宣布封闭拆迁!!关于你们约会的美好种种一下子夷为平地呢!(来自单身狗的善意提醒)作为红坊名店之首的……寺库成为(nbsp宝达日内瓦nbsp)首次进入中国市场的官方近日,瑞士高端腕表品牌BEDATamp;CO与中国最大的高端精品生活方式平台寺库(SECOO)达成战略合作。BEDATamp;CO将正式入驻寺库并在中国独家发售,这也标志着寺库……MARCnbspO39POLOnbsp2017秋冬新品温暖上【2017秋冬,北京】追随本性的MarcOPolo在50周年庆的同时,推出了2017年的秋冬新品。品牌依然坚持崇尚闲适的都市生活方式,致力于追求将精选的天然优质材料与精湛制作工……告别路人甲,穿上印花就对了!一场关于印花的时尚风潮开启!无论是秀场还是街拍,各路时尚高手纷纷将各类印花搬上身。而印花的好处,就是能将一件简单的单品,分分钟摆脱沉闷、单调,赋予新的时尚度!a02绝对是最擅长……比Linus更厉害的程序员,这家伙一定是穿越回来的LinusTorvalds是个非常厉害的程序员,因为他有两个名扬天下的作品:Linux和Git。如果单论技术能力,有一个人,也许比Linus更强。我在看他主页项目列……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网