ECMAScript 2016 又称为 ES2016,是 JavaScript 语言的一个版本。在这个版本中,引入了两个新的数据结构:WeakMap
和 WeakSet
。这两个数据结构的出现,让我们的 JavaScript 代码更加健壮和灵活。
WeakMap 和 WeakSet 的介绍
在理解 WeakMap
和 WeakSet
之前,我们需要了解一下 Map
和 Set
这两个数据结构。
Map
是一个键值对的集合,其中的键可以是任意值,包括基本类型和对象。相比之下,Set
是一个值的集合,其中的值可以是任意值,包括基本类型和对象。
WeakMap
和 WeakSet
也是一种键值对集合和值的集合,但与 Map
和 Set
不同的是,它们中的键和值必须是对象。
使用 WeakMap
和 WeakSet
的好处是,它们不会对对象的垃圾回收机制造成影响。也就是说,在没有其它引用的情况下,对象会被垃圾回收,并从 WeakMap
和 WeakSet
中自动移除。
WeakMap 的使用
WeakMap
是一种映射表,其中的键必须是对象。简单地说,WeakMap
允许我们将对象与元数据相关联,而且当对象被回收时,元数据也会被自动移除。
下面是一个简单的示例,演示了如何使用 WeakMap
来存储对象的元数据:
// javascriptcn.com 代码示例 const metadata = new WeakMap(); function setMetadata(obj, data) { metadata.set(obj, data); } function getMetadata(obj) { return metadata.get(obj); } const obj1 = {}; setMetadata(obj1, 'metadata for object 1'); const obj2 = {}; setMetadata(obj2, 'metadata for object 2'); console.log(getMetadata(obj1)); // 'metadata for object 1' console.log(getMetadata(obj2)); // 'metadata for object 2'
在这个示例中,我们创建了一个 metadata
的 WeakMap
实例。然后,我们定义了两个函数 setMetadata
和 getMetadata
,用于设置和获取对象的元数据。最后,我们创建了两个新的对象 obj1
和 obj2
,并调用了 setMetadata
函数来设置它们的元数据。最后,我们使用 getMetadata
函数获取每个对象的元数据,并在控制台中将其输出。
需要注意的是,WeakMap
的键必须是对象。如果我们对其它类型的值(比如字符串或者数字)进行操作,就会抛出一个 TypeError 错误。
WeakSet 的使用
WeakSet
是一种值的集合,其中的值必须是对象。与 WeakMap
类似,当集合中的对象被回收时,它们也会自动从集合中移除。
下面是一个简单的示例,演示了如何使用 WeakSet
来存储对象的集合:
// javascriptcn.com 代码示例 const set = new WeakSet(); const obj1 = {}; const obj2 = {}; const obj3 = {}; set.add(obj1); set.add(obj2); console.log(set.has(obj1)); // true console.log(set.has(obj2)); // true console.log(set.has(obj3)); // false set.delete(obj1); console.log(set.has(obj1)); // false console.log(set.has(obj2)); // true
在这个示例中,我们创建了一个 set
的 WeakSet
实例。然后,我们创建了三个新的对象 obj1
、obj2
和 obj3
。接下来,我们分别将 obj1
和 obj2
添加到集合中。最后,我们使用 has
函数检查集合中是否包含 obj1
、obj2
或 obj3
,并使用 delete
函数从集合中删除了 obj1
。
需要注意的是,WeakSet
的值必须是对象。如果我们尝试将其它类型的值添加到集合中,就会抛出一个 TypeError 错误。
总结
WeakMap
和 WeakSet
是 JavaScript 语言中的两个新数据结构,它们能够让我们的代码更加健壮和灵活。它们的最大优势在于,它们不会对对象的垃圾回收机制造成影响,从而让我们的代码更加可靠。
在使用 WeakMap
和 WeakSet
时,需要注意键和值必须是对象。否则,就会抛出一个 TypeError 错误。同时,由于 WeakMap
和 WeakSet
中的对象会被垃圾回收时自动移除,因此我们可以用它们来存储对象的元数据和对象的集合。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65390a9e7d4982a6eb2417bb