ES6 中的 Set 和 WeakSet 又简单又实用

阅读时长 5 分钟读完

引言

在 ES6 中,Set 和 WeakSet 是新加入的数据结构。它们都是用于存储一组唯一的值。Set 类似于数组,但它的值必须是唯一的,而 WeakSet 则是一种弱引用的结构,在没有其他引用时,它的值会被自动清除。

本文将详细介绍 Set 和 WeakSet 的使用方法和优缺点,并提供示例代码帮助读者更好地理解它们的特性和使用场景。

Set

基本用法

Set 的使用方法与数组类似,可以通过构造函数创建一个 Set 对象,并通过 add 方法向其中添加元素。

通过 add 方法添加的元素是唯一的,重复的元素将被忽略。

迭代器

Set 也支持迭代器,可以通过 for...of 或 forEach 方法遍历其中的元素。

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

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

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

属性和方法

Set 有以下常见的属性和方法:

  • size:返回 Set 中元素的个数。
  • has(value):判断 Set 是否包含某个值。
  • delete(value):从 Set 中删除某个值。
  • clear():清空 Set 中的所有元素。

Set 应用场景

Set 在数组去重、集合运算等方面有着广泛的应用场景。以下是一个使用 Set 进行数组去重的例子:

WeakSet

基本用法

WeakSet 与 Set 的使用方法差不多,不同的是 WeakSet 中的值只能是对象,并且是弱引用关系,即在没有其他引用时会被自动清除。

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

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

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

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

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

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

在上面的例子中,obj1 作为一个对象被添加到了 WeakSet 中。即使在后面将 obj1 赋值为 null,WeakSet 中仍然保存了原对象的引用。而通过添加一个匿名对象到 WeakSet 中,该对象的引用是弱引用关系,即使该对象的引用不存在,WeakSet 也不会保存它。

由于 WeakSet 中的值是弱引用关系,因此我们无法获取其中的所有值或者获取其中值的个数。

应用场景

WeakSet 主要用于存储一些临时对象,比如缓存对象或者监听器。当临时对象不再被使用时,WeakSet 会帮助自动清理它们的内存空间。下面是一个使用 WeakSet 缓存对象的例子:

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

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

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

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

在上面的例子中,cached 函数接收一个 expensiveOperation 函数作为参数,并返回一个新的函数,该函数将缓存 expensiveOperation 的结果。cached 函数使用 WeakSet 来保存缓存结果的对象,这样在对象没有其他引用时,WeakSet 会自动清除它们的内存空间。

总结

通过以上介绍,我们可以看到 Set 和 WeakSet 都是一种非常实用而且容易上手的数据结构。Set 经常用于数组去重、集合运算等场景,在实现缓存、监听器等功能时,WeakSet 也是一种不错的选择。对于对内存空间比较敏感的应用场景,使用 WeakSet 可以帮助减少垃圾回收的负担,从而提高应用程序的性能。

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

纠错
反馈