在 ES6 之前,JavaScript 原生的数据结构主要包括:数组、对象、字符串、数字等。ES6 引入了许多新的数据结构,其中 WeakMap 和 WeakSet 是比较特殊、具有实用性的两个数据结构。本文将详细介绍 WeakMap 和 WeakSet 的定义、用法、性质、应用场景和示例代码。
1. WeakMap
1.1 定义和用法
WeakMap 是一种 Map 结构,它的键只能是对象,值可以是任意类型。与 Map 不同的是,WeakMap 对其键是弱引用,即只要键对象的引用计数为 0,就会被自动回收(GC)。WeakMap 的普通方法包括 get、set、has、delete 等,但没有 size 属性和遍历方法。
WeakMap 的定义方式如下:
let wm = new 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 的定义方式如下:
let ws = new 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