ES8 中新增的 WeakMap 和 WeakSet

阅读时长 4 分钟读完

JavaScript 语言是一门动态的、基于对象的脚本语言,现在已经成为 Web 前端开发的事实标准。而在 ES8(也就是 ECMAScript 2017)中,新增了 WeakMap 和 WeakSet 这两个数据结构,为前端开发带来了更加便捷和高效的开发方式。

本文将介绍 WeakMap 和 WeakSet 的知识点,包括其定义、适用场景、使用示例等,希望能够帮助前端开发者更好地理解和应用这两种数据结构。

1. WeakMap

WeakMap 是 ES6 中新增的一种 Map 类型的弱引用版本。它和 Map 不同的是,WeakMap 中的键(key)只能是对象(Object),而且这个对象是“弱引用”(weakly held)的。也就是说,当这个对象的其他引用被删除时,WeakMap 中保存的键值对也会被自动地清除。

以下是 WeakMap 的定义方式:

1.1 适用场景

WeakMap 主要是在对象存储方法中使用的,比如事件处理器、对象缓存、私有属性等。因为 WeakMap 中添加的键值对并不会造成内存泄露问题,所以建议在这样的场景下使用它。

1.2 使用示例

  1. 缓存 DOM 元素

下面的代码展示了如何将 DOM 元素保存到 WeakMap 中:

  1. 实现私有属性

通过 WeakMap 我们可以实现类似于私有属性的功能,例如:

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

2. WeakSet

WeakSet 和 Set 的主要不同在于,WeakSet 中存储的对象同样是“弱引用”的。WeakSet 和 Set 一样,是不重复的值的集合,但是它只可以存储对象引用,而且当这个对象的其他引用被删除时,WeakSet 中保存的键值对也会被自动地清除。

以下是 WeakSet 的定义方式:

2.1 适用场景

WeakSet 主要用于保存一些“短暂”的对象,比如临时的对象列表。只要对象不再被引用,就会被自动删除。这种方式非常适用于一些需要临时对象的场景,比如临时缓存一些对象、标记处理过的对象等等。

2.2 使用示例

  1. 标记一些对象已经被遍历过
  1. 临时保存一些对象
-- -------------------- ---- -------
-------- ------------------- -
  --- -- - --- ----------
  ------ ----------------- -- -
    -- -------------- -
      ------ ------
    -
    -------------
    ------ -----
  ---
-
----- ----- - --- -- -- -- -- -- -- -- ---
--------------------------------- -- --- -- -- -- -- --

总结

WeakMap 和 WeakSet 作为 ES8 中新增加的数据结构,为我们提供了一种更加高效、便捷的开发方式。在使用 WeakMap 和 WeakSet 时,需要注意其特点和适用场景,以便更好地利用它们提高开发效率和代码质量。

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

纠错
反馈