已经有一些关于map和弱map的问题,像这样:What'sthedifferencebetweenES6MapandWeakMap?但我想问一下在什么情况下我应该赞成使用这些数据结构?或者当我偏爱其中一个时我应该考虑什么?数据结构示例来自:https://github.com/lukehoban/es6features//Setsvars=newSet();s.add("hello").add("goodbye").add("hello");s.size===2;s.has("hello")===true;//Mapsvarm=newMap();m.set("hello",42);m.
我正在阅读WeakMap的描述,它说:InnativeWeakMaps,referencestokeyobjectsareheld"weakly",whichmeansthattheydonotpreventgarbagecollectionincasetherewouldbenootherreferencetotheobject.通过阅读本文,我的理解是WeakMaps用于您试图利用JavaScript垃圾回收的实例。我从根本上不理解的是我加粗的那行。为什么在普通Map中,没有引用它们的对象不会被垃圾回收?这有什么好处,我是否必须从普通map中明确删除?
我刚刚读到WeakMaps通过专门使用对象作为键来利用垃圾收集,并且将对象分配给null等同于删除它:letplanet1={name:'Coruscant',city:'GalacticCity'};letplanet2={name:'Tatooine',city:'MosEisley'};letplanet3={name:'Kashyyyk',city:'Rwookrrorro'};constlore=newWeakMap();lore.set(planet1,true);lore.set(planet2,true);lore.set(planet3,true);console.l
我想创建一个以DOM元素为键的散列。以下代码说明了这一点:varhash={};varset=function(element,value){hash[element]=value;};varget=function(element){returnhash[element];};set(document.getElementById('foo'),'bar');get(document.getElementById('foo'));//returns'bar'如何确保HashMap到每个Element的唯一值?请注意,我不能使用原始ID字符串作为键,因为可以传入任意Element,包括
我一直在使用WeakMaps在JavaScript中,在查看文档后我意识到clear方法已被deprecated/removedfromECMAScript6.这是什么原因?为什么要强制我们做一个明确的功能,比如:clear(){this._weakmap=newWeakMap()} 最佳答案 “Themappingfromweakmap/keypairvaluecanonlybeobservedoraffectedbysomeonewhohasboththeWeakMapandthekey.Withclear(),someonew
functionf(){constw=newWeakMap();consto={};w.set(o,{v:o});returnw;}constweakMap=f();对于给定的代码,唯一的weakMap项目是否被认为是可达的?因此,它是否会被垃圾收集?PS:这个问题是从规范的Angular问的,不是具体的实现。 最佳答案 引用WeakMapObjectssection,IfanobjectthatisbeingusedasthekeyofaWeakMapkey/valuepairisonlyreachablebyfollowinga
ECMAScript6引入了弱映射,在Node.JSv0.11.3中通过--harmony标志可用。请考虑以下事项。letweakMap=WeakMap();letkey=[];letrubbish='fishcans';weakMap.set(key,rubbish);rubbish='emptybottle';//Prints"fishcans"console.log(weakMap.get(key));我的印象是,对于弱映射,从键到值的引用弱,所以如果对值的唯一引用是键,那么值就不能不再被访问。那么为什么值'fishcans'仍然可以访问并且没有被垃圾收集?变量rubbish不再
我想在JavaScript中缓存大对象。这些对象是通过键来检索的,缓存它们是有意义的。但它们不会一次全部放入内存,所以我希望在需要时对它们进行垃圾回收-GC显然知道得更多。使用其他语言中的WeakReference或WeakValueDictionary来创建这样的缓存是非常简单的,但是在ES6中我们有WeakMap,键弱的地方。那么,是否有可能制作类似WeakReference的东西或从WeakMap制作垃圾收集缓存? 最佳答案 在两种情况下,弱散列映射很有用(您的似乎适合第二种情况):希望将信息附加到具有已知身份的对象;如果该对
我正在尝试使用WeakMaps做显而易见的事情:我想创建一个弱引用。特别是,我想要一个事件监听器列表,而该列表不会影响监听器的生活。所以我很高兴找到WeakMaps,直到我看到它们只是为了满足一个(相当罕见的)用例而构建的,扩展了原本密封的对象。我想不出我什么时候想这样做,但我一直需要听众名单。是否有可能以我没有想到的巧妙方式使用WeakMaps? 最佳答案 不,不可能使用WeakMaps创建弱引用。WeakMaps不可迭代,要使用它们你总是需要key。这是一个深思熟虑的决定(也是here),因此垃圾收集不会影响程序的语
JavaScriptWeakMap不允许您通过设计获得key、长度或大小。是否有可能以某种方式循环访问条目?如果不是..Chrome控制台是如何做到这一点的? 最佳答案 Isitpossibletoneverthelessloopoverentriesinsomeway?不,正如您所说,WeakMap的内容在设计上是不可访问的,并且没有可迭代性。Ifnot…howdoestheChromeconsoledothis?控制台使用JS引擎的调试API,它允许访问对象的内部结构(也可以访问状态、包装原语等)等等。