在 JavaScript 的新标准 ES6 中,引入了 Set 和 WeakSet 两种新的集合类型,它们可以方便地存储不重复的数据。本文将会介绍这两个集合类型的区别,并提供使用场景和示例代码。
Set
Set 是 ES6 中的一个新的数据结构,它类似于数组,但是可以存储不重复的数据。Set 实例化后包含一个内部数据结构,可以通过 add()
方法添加元素,使用 delete()
方法删除元素,通过 has()
方法判断是否包含某个元素,使用 size
属性获取元素数量,或者通过 forEach()
方法遍历集合中的元素。
下面是一个简单的 Set 使用示例:
const set = new Set(); set.add('a'); set.add('b'); set.add('a'); // 重复元素不会被添加 console.log(set.size); // 2 console.log(set.has('a')); // true console.log(set.has('c')); // false set.forEach(value => console.log(value)); // 输出 a 和 b
WeakSet
WeakSet 也是 ES6 中的一个新的数据结构,它与 Set 类似,但有以下不同:
- WeakSet 中只能存储对象,不能存储原始值;
- WeakSet 中存储的对象只能是弱引用,即当对象没有被其他变量或对象引用时,可以被垃圾回收器回收;
- WeakSet 没有
size
属性,无法获得元素数量,也不能遍历其中的元素。
下面是一个简单的 WeakSet 使用示例:
const weakSet = new WeakSet(); const obj1 = { a: 1 }; const obj2 = { b: 2 }; weakSet.add(obj1); weakSet.add(obj2); console.log(weakSet.has(obj1)); // true console.log(weakSet.has({ a: 1 })); // false,弱引用引用的不是同一个对象 weakSet.delete(obj2);
使用场景
Set 和 WeakSet 适用于不同的场景,下面列举一些常见的使用场景。
Set 的使用场景
- 去重复 - Set 能够自动排除重复的数据,适用于对数据进行去重的场景;
- 数组去重 - 将原数组放入 Set 中,然后再将 Set 转换回数组,这是一种较为简洁的数组去重方法;
- 判断值是否存在 - 使用 Set 中的
has()
方法判断某个值是否存在; - 遍历 - 使用 Set 中的
forEach()
方法遍历 Set 中的元素。
-- -------------------- ---- ------- -- ---- ----- --- - --- -- -- -- -- --- ----- --------------- - ------- ---------- -- --- -- -- -- -- -- --- ----- --- - --- --------- ---- ------ ----------------- -- -------------------- -- ------- ----- --- - --- --------- ---- ------ -------------------------- -- ---- -------------------------- -- -----
WeakSet 的使用场景
- 存储不重复的对象 - 由于 WeakSet 只能存储对象,且存储的对象只能是弱引用,适用于存储一些只在某些情况下存在的对象,例如缓存等。
-- -------------------- ---- ------- ----- ----- - --- ---------- -------- --------------------- - -- ------------------ - ------ ----------------- - ---- - ----- --------- - --------- -------------- ---------------- ----------- ------ ---------- - -
总结
Set 和 WeakSet 都是 ES6 中的新数据结构,它们都能存储不重复的数据,但是 WeakSet 中只能存储对象,并且存储的对象只有在弱引用仍在被其他变量或对象引用时才存在。根据不同的使用场景,我们可以判断选择使用 Set 还是 WeakSet,以提高代码的可读性和效率。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64dee552f6b2d6eab3a0b011