ECMAScript 2019 引入了一种新的数据类型 WeakMap 和 WeakSet,它们可以用于特殊操作 JavaScript 中的对象和集合。本文将介绍它们的特点、使用方法,以及与其他数据类型的比较。
WeakMap
WeakMap 是一种映射,它将对象作为键,并且只保存弱引用。即,当对象被垃圾回收时,WeakMap 中相应的键值对也会被自动删除。这种特性使得 WeakMap 更适合于一些特殊的场景,如缓存、配置等。
使用 WeakMap 可以实现对某个对象的私有变量的存储和访问。具体方法是,使用对象作为键来保存私有变量,并将其值保存在 WeakMap 中。由于 WeakMap 对键的引用是弱引用,因此即使该对象被销毁,私有变量也不会一直存在于内存中。
下面是一个使用 WeakMap 实现对象私有变量的示例代码:
-- -------------------- ---- ------- ----- ----------- - --- ---------- ----- ------- - ----------------- - ----- ------- - - ---- -- --------------------- --------- - --------- - ------ --------------------------- - ------------- - ----- ------- - ---------------------- ------------ - ----- --------------------- --------- - - ----- --- - --- --------------- --------------------------- -- --- --------------------- --------------------------- -- -----
在上述代码中,privateData 是一个 WeakMap 实例,用于保存对象的私有变量。在 MyClass 的构造函数中,创建一个包含 name 属性的私有变量对象,并使用 this 作为键将其保存在 privateData 中。在 getName 和 setName 方法中,使用 privateData 获取该对象的私有变量,并进行操作。
需要注意的是,由于 WeakMap 只保存弱引用,因此在实际使用中需要注意对象是否被垃圾回收的时间点。
WeakSet
WeakSet 是一种集合,它存储的是对象的弱引用。与 Set 不同的是,WeakSet 中的对象不会被计入垃圾回收机制的引用计数,因此当对象被销毁时,WeakSet 中相应的项也会被自动删除。
WeakSet 通常用于实现对象的某些特殊属性。如下这个示例代码,我们使用 WeakSet 来记录已经访问过的对象:
-- -------------------- ---- ------- ----- -------------- - --- ---------- -------- ---------- - -- ------------------------- - ------- - -- -- --------- --- ------------------------ -
在以上代码中,visitedObjects 是一个 WeakSet 实例,用于记录已经访问过的对象。在 visit 函数中,如果 visitedObjects 中已经包含该对象,则直接返回。否则,进行相关操作,并将该对象添加到 visitedObjects 中。
需要注意的是,由于 WeakSet 只保存弱引用,因此在实际使用中需要注意对象是否被垃圾回收的时间点。
WeakMap 与 WeakSet 的比较
WeakMap 和 WeakSet 的使用场景是有区别的,下面是它们的比较:
- WeakMap 通常用于保存对象的私有变量,而 WeakSet 通常用于记录已经访问过的对象。
- WeakMap 需要使用对象作为键,而 WeakSet 不需要键。
- WeakSet 中的对象只是弱引用,即对象不会被计入垃圾回收机制的引用计数,相对更加安全一些。
总结
ECMAScript 2019 中引入了 WeakMap 和 WeakSet 这两个新的数据类型,它们都是基于弱引用的,可以实现对 JavaScript 中的对象和集合的特殊操作。具体应用上,可根据不同的需求来灵活选择使用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/651f79da95b1f8cacd70869a