在 Javascript 中,弱类型集合是一种非常实用的数据结构,可以存储各种数据类型,包括对象、数组等等。在 ES2021 中,我们终于有了原生的实现弱类型集合的数据结构,即 WeakCollections。这给我们提供了更好的数据存储方案,来让我们看看它的详细内容。
WeakCollections 是什么?
在 Javascript 中,我们通常使用 Map 和 Set 来存储数据。这些数据结构是非常实用的,但是它们的一个缺点是,它们只能存储对象作为键值,而不能存储原始类型。
所以,WeakCollections 就来了 - 它是一种新的 Javascript 数据结构,它集成了 WeakMap 和 WeakSet。与传统的 Map 和 Set 不同,WeakCollections 提供了一种在键是对象时,利用两者的弱引用特性进行真正的键值对连接,保证当这个键不再拥有其他引用时,可以从集合中删除。这使得 WeakCollections 成为一种非常有效的管理内存和避免内存泄漏的数据结构。
弱引用是什么?
弱引用是一种与常规对象引用不同的引用方式,它不会阻止垃圾收集。当使用弱引用时,垃圾收集器可以在不经过显式释放的情况下释放引用对象。这使得弱引用非常适合使用那些需要动态释放绑定状态的场合,例如缓存或持久化数据。
在 Javascript 中,使用 WeakRef() 函数来创建弱引用。例如:
// 创建一个弱引用对象 const obj = { prop: "value" }; const weakRef = new WeakRef(obj);
如何使用 WeakCollections?
在 ES2021 中,我们可以使用四个新的全局对象来实例化 WeakCollections。
WeakSet 和 WeakMap 是 WeakCollections 的两个基本架构,一个用于存储对象,另一个用于存储键值对。这两种架构旨在提供对键或值的弱引用计数,以保证垃圾回收。
具体的方法如下:
WeakSet
new WeakSet([iterable]):创建一个新的 WeakSet 实例。iterable 可选。如果存在 iterable,它应该是一个可迭代对象,其中的每个对象都将添加到新集合中。
WeakSet.prototype.add(value):向 WeakSet 实例中添加一个新元素。如果新元素是对象,则它会被存储到 WeakSet 实例中,并使用弱引用计数保留,如果这个对象被回收了,那它将自动从集合中删除。
WeakSet.prototype.delete(value):从集合中删除一个元素。如果这个元素是包含了对象的引用,它会从 WeakSet 实例中被删除,并且使用弱引用计数释放。
WeakSet.prototype.has(value):如果 WeakSet 实例中存在对象,则返回 true,否则返回 false。
一个简单的 WeakSet 示例:
-- -------------------- ---- ------- ----- ---- - --- --- ----- ---- - --- --- ----- ---- - --- --- ----- ------- - --- -------------- ------- ------------------ ------------------------------- -- ---- ------------------------------- -- ---- ------------------------------- -- ---- --------------------- ------------------------------- -- -----
WeakMap
new WeakMap([iterable]):创建一个新的 WeakMap 实例。iterable 可选。如果存在 iterable,它应该是一个可迭代对象,其中的每个对象都将添加到新集合中。
WeakMap.prototype.set(key, value):在 WeakMap 实例中设置一个新的键值对。如果新的键是对象,则它将被存储到 WeakMap 实例中,并使用弱引用计数保留。如果键被回收了,它将自动从集合中删除。
WeakMap.prototype.get(key):如果键是 WeakMap 实例的键之一,则返回它的值;如果 not,则返回 undefined 。
WeakMap.prototype.delete(key):从集合中删除一个键值对。如果这个键是包含了对象的引用,它会从 WeakMap 实例中被删除,并且使用弱引用计数释放。
WeakMap.prototype.has(key):如果 WeakMap 实例中存在给定的键,则返回 true,否则返回 false。
一个简单的 WeakMap 示例:
-- -------------------- ---- ------- ----- ---- - --- --- ----- ---- - --- --- ----- ---- - --- --- ----- ---- - --- --- ----- ------- - --- --------------- ------ ------ -------- ------------------------------- -- --- -- ------------------------------- -- --- -- --------------------- ------------------------------- -- ---------
总结
WeakCollections 是 ES2021 中引入的新概念,它们提供了一种有效的管理内存和避免内存泄漏的方法。使用 WeakSet 和 WeakMap,可以存储各种数据类型,包括对象、数组等等。当键不再拥有其他引用时,它们的弱引用计数保证它们会自动从集合中删除,这有助于减少内存消耗并避免内存泄漏。尽管 WeakCollections 知识点比较深入,但是开发者可以在对这些特性有一定了解的情况下,运用其特性更好的写出优雅的代码。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c713da10032fedd3905fb8