学会使用 ECMAScript 2021 中的 Map 和 WeakMap

阅读时长 5 分钟读完

在 JavaScript 中,对象是一种非常常见和强大的数据类型。但是在某些场景下,我们可能需要使用一些更高级的数据结构来存储和处理数据,比如 Map 和 WeakMap。在 ECMAScript 2021 中,这两个数据结构得到了增强,本文将介绍如何使用它们。

Map

Map 是一种键值对集合,其中每个键唯一,可以是任意类型的值,包括对象和函数。Map 对象内部采用哈希表的数据结构实现,因此查找和插入的时间复杂度都是 O(1)。

创建 Map

我们可以使用以下两种方式创建一个 Map:

注意,由于 Map 的键可以是任意类型的值,因此可以使用对象、函数等复杂类型作为键。此外,由于 Map 对象是无序的,因此它不支持类数组对象,并且无法像数组那样使用 length 属性。

添加和删除元素

添加元素可以使用 set() 方法,删除元素可以使用 delete() 方法:

获取元素

获取元素可以使用 get() 方法,如果元素不存在,返回 undefined:

遍历 Map

Map 提供了以下四种遍历方式:

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

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

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

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

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

WeakMap

WeakMap 也是一种键值对集合,但是它的键必须是对象。WeakMap 内部采用哈希表实现,但是键被弱引用,因此键所指向的对象在没有其他引用时,可能被垃圾回收器清除,这就是 WeakMap 名称的由来。

创建 WeakMap

我们可以使用以下方式创建一个 WeakMap:

添加和删除元素

WeakMap 只有 set()get() 两个方法,无法遍历并删除元素。我们可以使用 delete() 方法删除元素:

注意事项

由于 WeakMap 的键是弱引用,因此要注意以下几点:

  • 键必须是对象,不能是基本类型的值;
  • 判断键是否存在的唯一方式是调用 get() 方法,并检查返回值是否为 undefined;
  • 不能使用 for-of 循环、forEach() 方法等方式遍历 WeakMap。

示例代码

下面是一个示例代码,展示了 Map 和 WeakMap 的用法:

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

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

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

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

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

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

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

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

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

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

总结

本文介绍了 ECMAScript 2021 中的 Map 和 WeakMap,它们可以用来存储和处理键值对数据,比普通对象更灵活、更高效。使用 Map 和 WeakMap 可以让我们在开发中更加便捷和高效,建议读者在实际开发中加以应用。

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

纠错
反馈