ES6 中的 Map 和 WeakMap 的使用详解

阅读时长 4 分钟读完

在 ES6 中,Map 和 WeakMap 是两个新的数据结构,它们可以用来存储键值对。Map 是一个比较常用的数据结构,它的键可以是任意值(包括函数、对象、NaN 等),而 WeakMap 只能使用对象作为键(因为 WeakMap 中存储的是对象的弱引用)。本文将深入讨论 Map 和 WeakMap 的使用,以及它们的区别和优缺点。

Map 的基本使用

Map 的创建可以使用 new Map(),也可以使用数组创建,如下所示:

其中,set 方法用于添加新的键值对,get 方法用于获取某个键对应的值,has 方法用于判断某个键是否存在,delete 方法用于删除某个键值对,size 属性用于获取 Map 中的键值对个数,如下所示:

-- -------------------- ---- -------
--- --- - --- ------
--------------- ----------
--------------- ----------

-----------------------------  -- --------
-----------------------------  -- ----

-------------------
-----------------  -- --- - ------ -- -------- -

----------------------  -- -

Map 还提供了一些其他方法,比如 keys、values 和 entries 方法,用于获取 Map 中的所有键、所有值,以及所有键值对:

WeakMap 的基本使用

WeakMap 使用对象作为键时,存储的是对象的弱引用。当这个对象被回收时,对应的键值对会被自动删除。WeakMap 的创建方式和 Map 一样,如下所示:

-- -------------------- ---- -------
--- ---- - - ----- ------ --
--- ---- - - ----- ------ --
--- ------- - --- --------------- ------------
----------------- ----------

-------------------------------  -- --------
-------------------------------  -- ----

---- - -----
-------------------------------  -- ---------
--------------------------  -- ---------

需要注意的是,由于 WeakMap 存储的是对象的弱引用,它的键必须是对象,并且不能被枚举。即使添加到 WeakMap 中的对象已经被删除,如果有其他地方仍然引用该对象,WeakMap 中的键值对也不会被删除。

Map 和 WeakMap 的区别

Map 和 WeakMap 的主要区别在于键值的引用类型和存储方式。普通的 Map 针对任意类型的键可以使用,而 WeakMap 只允许使用对象作为键,并且存储的是对象的弱引用。由于使用了弱引用,WeakMap 中的键值对不会影响垃圾回收,因此可以防止内存泄漏。

另外,Map 中的键值对可以通过遍历方式获取,而 WeakMap 中的键值对不能获得。WeakMap 的另一个限制是不能使用 size 属性来获取键值对的数量,因此只能使用 has 方法判断是否存在某个键值对。

总结

Map 和 WeakMap 是两个常用的 ES6 数据结构,用于存储键值对。Map 可以使用任意类型的键,WeakMap 只能使用对象作为键,并且存储的是对象的弱引用。使用时应根据具体情况选用合适的数据结构,以便更好地管理键值对,避免内存泄漏。

示例代码: https://codepen.io/pen/?template=xxdjzVW

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65a64353add4f0e0ffeff31e

纠错
反馈