专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

译通过内存快照看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

为了我们身体健康,饮食中可以提倡好色生活中说到某某好色,人们就会联想到品德缺失。但在饮食中对食物的好色却是值得广为提倡的。在中医学里,食物除分寒热外,还分为五味甜酸苦辣咸及五色黄青红白黑,并和五脏相对应。味甜和色黄养不吃油不吃荤就能降血脂?答案可能跟你想的不一样每天喝杯茶,控好血脂更健康高血脂,不仅可导致脂肪肝肝硬化胆石症等疾病,还是脑卒中冠心病心肌梗死猝死的危险因素。因而很多被查出高血脂的人,都将油脂视为大敌,有些人选择滴油不进还有人则只吃素不吃荤那这些做法真的春天,宁可少吃肉,也要常吃香菜,顺应时节正当鲜,营养又健康立春后阳气升发,我们要多吃一些温热和可以发汗散寒的食材。都说立春香菜辛温健脾,春季吃有助阳气的恢复,能健胃消食利尿通便发汗散寒。说起香菜,喜欢吃的人是爱的不得了,而不喜欢吃的人则是61岁男子坚持每天吃生大蒜,杀菌抗肿瘤,4个月健康状况如何?来源丨39健康网大蒜是很多人的心头爱,吃饺子要蘸蒜,吃面也要配蒜,涮火锅更是离不开包裹着大蒜的灵魂蘸料。大蒜在配料届几乎是万能的存在。不过在养生人士的眼里,大蒜几乎包治百病,能够杀农村俗语枕下放三物,健康又长寿,三物是什么?居住在农村,听的最多的莫过于乡野俚语,农村老人喜欢茶余饭后聚集在一起,随地而坐,侃侃而谈,天南海北,有影没影的事都要说出来,只要声音大,就是对的,偶尔为了证明自己的观点正确,就要掏湿邪清除百病消,健康长寿不是梦湿气被称为万恶之邪万病之源。在致病的风寒暑湿燥火这六淫邪气中,中医最怕湿邪。百病皆由湿为患,外湿引内湿,导致人体经络不畅,血液含氧量低。细胞缺氧,血流减慢,体内垃圾不能及时清除,堆旅行相亲健康积极的相亲方式官方通报公职人员相亲失败出言不逊近期,有一名公职人员因相亲失败在微信聊天中发表不当言论,引发社会广泛关注和谴责。相亲作为一种社交方式,本应该是互相了解尊重和理解的过程,而不是互相攻2023年医疗改革后,灵活就业人员还有必要买医保吗最近的医改,大家意见都非常大,有的人甚至要断保,那么先说我的看法,医疗改革后,灵活就业人员还有必要买医保,得分情况,首先得明白有哪几种情况医保一居民医保参保者是共济的受益者。居民医如何让孩子做事高效?从小养成这些习惯就可以家长百问百答开学了,终于把孩子送回学校,我顿时浑身轻松。再也不用全身心跟着陪玩陪读陪写作业,我也能有属于自己的一点点时间,这样的日子实在太美好。然而,回想起寒假辅导孩子的经历,快乐减碳时代,香港初创推出智能水耕种植机,开拓澳洲市场从日常生活出发减少碳足迹已成为大趋势,由香港初创企业水耕细作研发的全环控智能移动水耕种植机(SmartMobileFarm),供应蔬菜予香港市场,短短数年已达收支平衡。早前在香港贸四天工作制人司都满意ofo客户端已无法登录21日,全球最大四天工作制试验结果出炉公司对业务绩效感到满意,员工身心健康也有所改善。这项为期6个月涉及英国多个行业共计3300名员工的试验结束后,92的公司决定延长四天工作制模式
奇瑞2022年新能源车销量达23。28万辆同比增长112。9爱卡汽车行业新闻原创近日,奇瑞集团消息显示,随着12月份以10。55万辆的单月销量收官,奇瑞集团2022年累计销售汽车达到历史性的123。27万辆,同比增长28。2。其中,出口45女足曝欠薪丑闻!7个月3次讨薪无门,教练发声哭诉撕破脸太心寒中国女足在近来的口碑非常不错,尤其是去年夺得亚洲杯冠军之后,更是受到很多国足球迷的喜欢。正是因为中国女足获得这么大的殊荣,让全国女足各个赛事因此受到更多广泛的关注,很多球迷自然期待恭喜了!马刺绿军完成2换0交易,湖人心仪对象要价确定头条创作挑战赛北京时间1月6号,NBA常规赛正在热火朝天进行中,联赛各队都在为拿到更多场次的胜利努力备战着,争取帮助球队拿到总决赛的入场券,以完成夺冠美梦。与此同时,赛场之外的动态看到这些瞬间,才知道我们经历了一个怎样的2022转眼间,我们迎来了2023年。过去的一年里,什么事让你印象最深刻呢?北京冬季残奥会顺利举办,俄乌局势愈演愈烈,阿根廷勇夺大力神杯除了这些举足轻重的年度大事记以外,还伴随着无数的如星收藏616集神级纪录片跟着书本去旅行,假期必看!中央广播电视总台为孩子拍了一部神级纪录片跟着书本去旅行,这是一部大型体验式文化教育节目,节目以中小学课本或经典名著为线索,在读万卷书的同时行万里路。影片涉猎领域之深广,让人惊奇寻迹NBA西部排名榜双榜首携手取胜,快船耻辱挂单,火箭成最大输家20222023赛季NBA常规赛正在如火如荼的进行中,1月6日4场比赛结束后,西部排名榜再次悬念迭起双榜首掘金和灰熊纷纷取胜,继续并列榜首独行侠不敌全联盟第一的凯尔特人,止步7连胜历史前10球星最具含金量纪录詹皇3万1万1万,乔丹10届得分王在NBA里所有球员最终希望达到的成就就是历史前十,一般来说历史第一人乔丹的位置是不可撼动的,因为他拥有太多堪称神迹的纪录,6届FMVP更是让人望而却步,而且他将篮球推广到了全世界,血氧仪疯抢价格暴涨,智能手表可以成为平替吗?近期,血氧仪成为大家大力购买的一个产品,原因是什么也不用多说,懂得都懂。无论是线上电商平台还是线下药店,都出现了供不应求的情况,甚至还出现了大幅度溢价的情况。即便是抢到了,在购买页小米和比亚迪,谁会让梦想窒息?2014年4月,最懂中国人的乐视集团衍生出一家电车企业法拉第未来,创始人贾跃亭将车厂建在象征财富和科技的加州,吹响中国新能源汽车品牌崛起的号角,短时间内吸引巨量资本进入尚处于萌芽发2022年最成功的4款国产手机,综合体验让人满意,关键价格很实惠您在阅读前请点击上面的关注二字,后续会第一时间为您提供更多有价值的相关内容,感谢您的支持。2022年已经过去了,在2022年的一些国产手机发布了上百款,不过现在的国产手机综合体验越微信安卓8。0。32最新官方正式版下载发布IT之家1月6日消息,微信安卓平台迎来了8。0。32正式版更新,本次更新安装包文件详细信息如下微信安卓正式版8。0。32(ARM64)安装包文件大小238。41MB更新时间2023
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网