WeakSet
WeakSet和Set都是不重复的值的集合。
WeakSet和Set有两点不同。
1、WeakSet的成员只能是对象,Set的成员不仅可以是对象还可以是其他类型的值。
2、WeakSet中的对象都是弱引用,垃圾回收机制不考虑WeakSet对该对象的引用,即,如果其他对象不再引用该对象,垃圾回收机制会自动回收该对象所占用的内容,不用考虑该对象是否还存在于WeakSet中。
垃圾回收:
垃圾回收机制是依赖引用计数,如果一个值的引用次数不为0,垃圾回收机制是不会释放这块内存的。
当结束使用该值之后,如果忘记取消引用,会导致内存无法释放,进而可能引发内存泄漏。而WeakSet永远,不会出现内存泄漏的问题。因为WeakSet里面的引用是不计入垃圾回收机制的。WeakSet适合临时存放一组对象,以及存放跟对象绑定的信息。只要对象在外部消失,它在WeakSet里面的引用就会自动消失。
WeakSet没有size属性,也没有办法遍历其成员。
有三个操作方法:
add(value),delete(value),has(value)
WeakSet不能遍历的一个原因是:所有成员都是弱引用,随时可能消失,遍历机制无法保证成员存在,可能刚遍历结束,成员就取不到了。
WeakSet的一个最大的用处是:存储DOM结点,不用担心这些这些节点从文档中删除,引发内容泄露。
WeakMap
WeakMap和WeakSet相似,只要外部引用消失,WeakMap内部的引用就会自动被垃圾回收清除。
WeakMap日常最大的应用:(注册监听事件的listener对象很适合用WeakMap实现)
因为将监听函数放在WeakMap中,一旦DOM对象消失,与它绑定的监听函数也会自动消失。
let myElement = document.getElementById('logo');
let myWeakmap = new WeakMap();
myWeakmap.set(myElement,{timesClicked:0});
myElement.addEventListener('click',function(){
let logoData = myWeakmap.get(myElement);
logoData.timesClicked++;
},false);
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。