es6之WeakSet数据结构

240 阅读1分钟

hello,大家好,今天一起共读es6的WeakSet数据结构。

了解WeakSet结构时,需要拿他与Set进行对比的来理解。

相同点:都是不重复的值的集合,都有add(),delete(),has()方法。

const ws = new WeakSet(); // 同样需要new来创建
constobj = {};
const foo = {};
ws.add(window);
ws.add(obj);
ws.has(window); // true
ws.has(foo);   // false
ws.delete(window); // true
ws.has(window) //false

不同点1:WeakSet 的成员只能是对象,而不能是其他类型的值。

const a = [[1, 2], [3, 4]];
const ws1 = new WeakSet(a);
console.log(ws1) // 正常返回WeakSet数据结构
const b = [3, 4];
const ws2 = new WeakSet(b);
console.log(ws2)  // 报错:Uncaught TypeError: Invalid value used in weak set(…)

不同点2:WeakSet 中的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中。由此导致:WeakSet 的成员可能随时会消失。WeakSet 无size属性,ES6 规定WeakSet不可遍历。

应用:WeakSet 的一个用处,是储存 DOM 节点,而不用担心这些节点从文档移除时,会引发内存泄漏。

总结:WeakSet结构比较特殊,使用场景较少,往往在关注代码性能方面才有可能用到。使用此种数据结构的宗旨是:WeakSet 适合临时存放一组对象,以及存放跟对象绑定的信息。只要这些对象在外部消失,它在 WeakSet 里面的引用就会自动消失。