在 ES6 中,新增了两个集合类:Set 和 WeakSet,它们提供了一种存储无序的、唯一的值的方式。它们与数组的区别在于,数组中的值可以重复,而集合中的值必须唯一。
Set
Set 可以用来存储任何类型的唯一值,它为存储、查询、删除元素提供了高效的方法。
声明和基本使用
声明一个 Set:
const mySet = new Set();
添加元素:
mySet.add(1); mySet.add(2); mySet.add(3);
删除元素:
mySet.delete(2);
查询元素:
mySet.has(1); // true mySet.has(2); // false
获取集合中元素的数量:
mySet.size; // 2
遍历集合:
mySet.forEach(item => console.log(item));
Set 的应用
Set 主要用来去重或者判断元素是否存在。
const arr = [1, 2, 3, 3, 2, 4, 5, 1]; const set = new Set(arr); const uniqueArr = [...set]; // [1, 2, 3, 4, 5] const hasElement = set.has(1); // true
Set 和数组的转换
由于 Set 和数组之间的转换比较常见,因此 ES6 提供了两个方法:Array.from
和 Array.prototype.slice.call
。
将 Set 转换为数组:
const mySet = new Set([1, 2, 3]); const myArray = Array.from(mySet); // [1, 2, 3]
将数组转换为 Set:
const myArray = [1, 2, 3]; const mySet = new Set(myArray); // 1, 2, 3
WeakSet
WeakSet 与 Set 类似,但它只能存储对象类型的值,而且这些对象都是弱引用,即在没有其它引用时会被垃圾回收器自动回收。
声明和基本使用
声明一个 WeakSet:
const myWeakSet = new WeakSet();
添加元素:
const obj1 = { a: 1 }; const obj2 = { b: 2 }; myWeakSet.add(obj1); myWeakSet.add(obj2);
删除元素:
myWeakSet.delete(obj1);
查询元素:
由于 WeakSet 中的元素都是弱引用,因此不能使用 has
方法查询元素是否存在。
WeakSet 的应用
WeakSet 主要用来存储一些临时对象,这些对象只有在其它地方还有引用时才需要存在。
-- -------------------- ---- ------- ----- ----- - --- ---------- -------- ------------------ - -- ---------------- - ------ ----- - ---- - --------------- ------ ------ - -
总结
在实际项目中,我们经常会遇到需要存储一些唯一的值或者临时对象的需求。Set 和 WeakSet 为这类需求提供了高效、便捷的解决方案。
- Set 用于存储任意类型的唯一值,可以高效地进行存储、查询、删除等操作;
- WeakSet 用于存储一些临时对象,常用于检查对象是否存在,全局缓存等场景。
在使用 Set 和 WeakSet 时需要注意:
- 在 Set 中,值是唯一的,但对象的引用会影响到唯一性;
- 在 WeakSet 中,对象是弱引用,只要该对象在其它地方没有引用,就会被垃圾回收器自动回收。
因此需要根据具体需求选择合适的集合类型。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c5e08895c405902ee3b94a