使用弱引用是我从未见过的实现,所以我试图弄清楚它们的用例是什么以及实现如何工作.什么时候需要使用WeakHashMap或者WeakReference它是如何使用的?
WeakSet应该通过弱引用来存储元素.也就是说,如果某个对象未被其他任何东西引用,则应该从WeakSet中清除它.
我写了以下测试:
var weakset = new WeakSet(),
numbers = [1, 2, 3];
weakset.add(numbers);
weakset.add({name: "Charlie"});
console.log(weakset);
numbers = undefined;
console.log(weakset);
Run Code Online (Sandbox Code Playgroud)
即使我的[1, 2, 3]数组没有被任何引用引用,它也不会从WeakSet中删除.控制台打印:
WeakSet {[1, 2, 3], Object {name: "Charlie"}}
WeakSet {[1, 2, 3], Object {name: "Charlie"}}
Run Code Online (Sandbox Code Playgroud)
这是为什么?
另外,我还有一个问题.将对象直接添加到WeakSets有什么意义,如下所示:
weakset.add({name: "Charlie"});
Run Code Online (Sandbox Code Playgroud)
那些Traceur的故障还是我错过了什么?
最后,如果我们甚至无法迭代它并获得当前大小,那么WeakSet的实际用途是什么?
在我重新进入JavaScript(和相关)之前,我已经完成了很多ActionScript 3,并且他们有一个Dictionary对象,它具有弱键,就像即将发布的WeakMap一样; 但AS3版本仍然像常规通用对象一样可枚举,而WeakMap特别没有.keys()或.values().
AS3版本允许我们安装一些非常有趣和有用的构造,但我觉得JS版本有些限制.这是为什么?
如果Flash VM可以做到这一点,那么是什么阻止浏览器做同样的事情呢?我读到了它是如何"非确定性"的,但这有点恰到好处?
阅读此说明后:http://wiki.ecmascript.org/doku.php?id = eth:weak_maps
我试图抓住它,但我没有得到整体情况.这是什么一回事呢?它似乎在Firefox 6中得到支持:http://kangax.github.com/es5-compat-table/non-standard/
javascript specifications data-structures weakmap ecmascript-6
我试图用WeakMaps 做明显的事情:我想创建一个弱引用.特别是,我想要一个没有该列表影响监听器生命的事件监听器列表.
所以我很高兴能找到WeakMaps,直到我看到它们只是为了满足一个(相当罕见的)用例,扩展其他密封的对象.当我想要这样做时,我想不到,但我一直都需要听众列表.
这有可能以一些我没有想到的聪明方式使用WeakMaps吗?
javascript weak-references ecmascript-harmony weakmap ecmascript-6
关于地图和弱地图已经存在一些问题,例如:ES6 Map和WeakMap有什么区别?但我想问一下,在哪种情况下我应该赞成使用这些数据结构?或者当我偏爱其他人时,我应该考虑什么呢?
来自以下网址的数据结构示例:https://github.com/lukehoban/es6features
// Sets
var s = new Set();
s.add("hello").add("goodbye").add("hello");
s.size === 2;
s.has("hello") === true;
// Maps
var m = new Map();
m.set("hello", 42);
m.set(s, 34);
m.get(s) == 34;
// Weak Maps
var wm = new WeakMap();
wm.set(s, { extra: 42 });
wm.size === undefined
// Weak Sets
var ws = new WeakSet();
ws.add({ data: 42 });
// Because the added object has no other references, it will not be held …Run Code Online (Sandbox Code Playgroud)