引言
在 ES6 中,Set 和 WeakSet 是新加入的数据结构。它们都是用于存储一组唯一的值。Set 类似于数组,但它的值必须是唯一的,而 WeakSet 则是一种弱引用的结构,在没有其他引用时,它的值会被自动清除。
本文将详细介绍 Set 和 WeakSet 的使用方法和优缺点,并提供示例代码帮助读者更好地理解它们的特性和使用场景。
Set
基本用法
Set 的使用方法与数组类似,可以通过构造函数创建一个 Set 对象,并通过 add 方法向其中添加元素。
const set = new Set(); set.add("apple"); set.add("banana"); set.add("orange"); set.add("apple"); console.log(set); // Set(3) { "apple", "banana", "orange" }
通过 add 方法添加的元素是唯一的,重复的元素将被忽略。
迭代器
Set 也支持迭代器,可以通过 for...of 或 forEach 方法遍历其中的元素。
-- -------------------- ---- ------- ----- --- - --- ------------- --------- ----------- --- ------ ---- -- ---- - ------------------ - ------------------ -- - ------------------ ---
属性和方法
Set 有以下常见的属性和方法:
- size:返回 Set 中元素的个数。
- has(value):判断 Set 是否包含某个值。
- delete(value):从 Set 中删除某个值。
- clear():清空 Set 中的所有元素。
Set 应用场景
Set 在数组去重、集合运算等方面有着广泛的应用场景。以下是一个使用 Set 进行数组去重的例子:
const arr = [1, 2, 2, 3, 4, 4]; const set = new Set(arr); console.log([...set]); // [1, 2, 3, 4]
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