在 ES6 中,除了一些常用的数据结构之外,还引入了 WeakSet 数据结构,它是一种弱引用的集合,用来存储对象,且对象只能在 WeakSet 中被引用一次。
WeakSet 与 Set 的区别
WeakSet 和 Set 非常相似,但是它们有两个主要差别:
- WeakSet 中只能存储对象,而不能存储原始值。
- 对象仅能被 WeakSet 引用一次,如果没有其他的变量或属性引用该对象,那么该对象在垃圾回收时会被自动清除。
为什么要使用 WeakSet
这里有一个例子,假如我们想在一个集合中存储对象,当这些对象不再使用时,我们希望它们能够被垃圾回收,那么可以考虑使用 WeakSet。例如下面的代码:
-- -------------------- ---- ------- ----- ----- - -- --------- ---- -- - --------- ---- --- ----- ----- - --- ---------- -------------------- -------------------- --------------------------------- -- ---- --------------- --- ------------------- -- -- --------- ---- -- --------------------------------- -- -----
在这个例子中,我们创建了一个 WeakSet,将两个用户对象添加到其中。当我们删除了一个用户后,即使他已经不再存在于 users 数组中,WeakSet 仍然保留了对这个对象的引用。WeakSet 有一些其他的使用场景,例如存储 DOM 节点。
如何使用 WeakSet
我们可以使用 WeakSet 的方法 add()、has() 和 delete() 来添加、检查和删除对象。另外,我们也可以使用构造函数来创建一个可迭代的 WeakSet。以下是一个使用 WeakSet 的示例:
-- -------------------- ---- ------- ----- ---- - --- ---------- -------- ---------------- - -------------- - ----- ---- - --- ----- ---- - --- ------------------ ---------------------------- -- ---- ---------------------------- -- -----
在上面的示例中,我们创建了一个 WeakSet,向其中添加了一个对象,然后检查了这个对象是否存在于集合中。如果我们尝试向 data 添加原始值,例如数字或字符串,就会抛出一个 TypeError。
总结
WeakSet 是一个弱引用的集合,用于存储对象。如果对象不再被其他变量或属性引用,那么将被垃圾回收。WeakSet 对于管理复杂的内存管理场景很有用,例如缓存和 DOM 节点管理。我们可以使用 add()、has() 和 delete() 方法来向 WeakSet 添加对象、检查对象是否存在和从 WeakSet 中删除对象。
参考资料
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645e0d09968c7c53b00764ce