ES6 中的 WeakMap 和 WeakSet 数据结构介绍

阅读时长 5 分钟读完

在 ES6 之前,JavaScript 原生的数据结构主要包括:数组、对象、字符串、数字等。ES6 引入了许多新的数据结构,其中 WeakMap 和 WeakSet 是比较特殊、具有实用性的两个数据结构。本文将详细介绍 WeakMap 和 WeakSet 的定义、用法、性质、应用场景和示例代码。

1. WeakMap

1.1 定义和用法

WeakMap 是一种 Map 结构,它的键只能是对象,值可以是任意类型。与 Map 不同的是,WeakMap 对其键是弱引用,即只要键对象的引用计数为 0,就会被自动回收(GC)。WeakMap 的普通方法包括 get、set、has、delete 等,但没有 size 属性和遍历方法。

WeakMap 的定义方式如下:

1.2 性质

  • WeakMap 的键只能是对象,不能是其他类型的值(比如字符串、数组、函数等)。
  • WeakMap 只能使用 set、get、has、delete 方法来操作键值对,不能遍历或清空整个 WeakMap,也不能获取 WeakMap 的长度。
  • 当 WeakMap 的键对象被自动回收后,对应的键值对也会自动从 WeakMap 中删除。

1.3 应用场景

  • 用于存储对象的私有属性,确保私有属性只能在对象内部被访问,外部无法访问。
  • 用于缓存临时数据,比如 Promise 的缓存。

1.4 示例代码

下面是一个使用 WeakMap 存储私有属性的示例:

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

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

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

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

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

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

2. WeakSet

2.1 定义和用法

WeakSet 是一种 Set 结构,它的成员只能是对象,同样也是弱引用。WeakSet 没有 size 属性和遍历方法,并且只能使用 add、has、delete 方法来操作成员。

WeakSet 的定义方式如下:

2.2 性质

  • WeakSet 的成员只能是对象,不能是其他类型的值(比如字符串、数组、函数等)。
  • WeakSet 只能使用 add、has、delete 方法来操作成员,不能遍历或清空整个 WeakSet,也不能获取 WeakSet 的长度。
  • 当 WeakSet 的成员对象被自动回收后,对应的成员也会自动从 WeakSet 中删除。

2.3 应用场景

  • 用于存储对象的临时状态或者中间结果,当对象状态或者结果被删除时,WeakSet 中对应的成员也会被删除,从而释放内存空间。

2.4 示例代码

下面是一个使用 WeakSet 存储临时状态的示例:

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

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

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

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

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

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

3. 总结

  • WeakMap 和 WeakSet 是一种弱引用的 Map 和 Set 结构,只允许对对象进行弱引用存储,有助于避免内存泄漏问题。
  • WeakMap 和 WeakSet 的应用场景比较特殊,一般适用于存储私有属性、缓存临时数据、存储临时状态等。
  • 对于普通的 Map 和 Set 结构,可以使用 let 或者 const 来声明,使用常规的操作方法 add、delete、get、set、has、size 等来处理。对于 WeakMap 和 WeakSet 结构,只能使用 let 声明,使用相应的操作方法来处理。
  • WeakMap 与 WeakSet 不能直接遍历,也不能清空其内部存储的所有数据,因此使用时需要格外小心,避免数据泄露和安全性问题。

以上就是 ES6 中的 WeakMap 和 WeakSet 数据结构介绍,希望能对大家的前端开发学习和实践有所帮助。

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

纠错
反馈