基础用法
-
ES6 提供了新的数据结构 Set(为构造函数)。
-
它类似于数组,但是成员的值都是唯一的,没有重复的值,可以用于去重
-
内部判断重复的判断语句的利用的"==="
-
Set结构没有key,只有value(也可以说key和value一样)
const s = new Set();
const a = [1,22,2,1,3,4,22,3];
console.log(new Set(a)) //Set(5) {1, 22, 2, 3, 4}
console.log(new Set(‘aabbvv’)) // Set(3) {“a”, “b”, “v”}
console.log([…new Set(‘aabbvv’)].join(‘’)) // “abv”
Set的属性和方法
| 属性/方法 | 用途 |
| :-- | :-- |
| Set.prototype.constructor
| 返回Set的构造函数ƒ Set() { [native code] }
|
| Set.prototype.size
| 返回Set实例的成员总数 |
| Set.prototype.add(value)
| 添加元素,返回 Set 结构本身 |
| Set.prototype.delete(value)
| 删除元素,返回一个布尔值,表示删除是否成功 |
| Set.prototype.has(value)
| 判断是否为set成员,表示该值是否为Set的成员 |
| Set.prototype.clear()
| 清除所有成员,没有返回值 |
| Set.prototype.keys()
| 返回遍历的key值 |
| Set.prototype.values()
| 返回遍历的value值 |
| Set.prototype.entries()
| 返回遍历的键值对方式 |
| Set.prototype.forEach()
| 使用回调函数遍历每个成员(遍历) |
遍历的应用
数组去重:
Array.from
方法可以将 Set 结构转为数组:
// 1.
function dedupe(array) {
return Array.from(new Set(array));
}
// 2.
function dedupe(array){
return […new Set(array)];
}
dedupe([1, 1, 2, 3]) // [1, 2, 3]
实现数学中的交集、并集和差集:
let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);
// 并集
let union = new Set([…a, …b]);
// Set {1, 2, 3, 4}
// 交集
let intersect = new Set([…a].filter(x => b.has(x)));
// set {2, 3}
// 差集
let difference = new Set([…a].filter(x => !b.has(x)));
// Set {1}
回到顶部 目录
WeakSet与Set的区别
相同点:不重复的值的集合,都是构造函数
不同点:
-
WeakSet的成员只能是对象,不然就报错
-
WeakSet是弱引用(即垃圾回收机制不考虑 WeakSet 对该对象的引用)
语法
const ws = new WeakSet([arr]);
WeakSet可以接受一个数组或者一个类似数组的参数
// 1.
const a = [[1, 2], [3, 4]];
const ws1 = new WeakSet(a);
// WeakSet {[1, 2], [3, 4]}
// a = {0:[1,2], 1:[3,4]}
// 2.
const b = [3, 4];
const ws2 = new WeakSet(b);
// Uncaught TypeError: Invalid value used in weak set(…)
// b = {0:3, 1:4}
-
1中a是数组有两个成员也数组,所以a的成员就赋值给了WeakSet的成员
-
2中b就是一个数组,成员不是对象,使用报错
方法
| 方法 | 用途 |
| :-- | :-- |
| WeakSet.prototype.add(value)
| 添加元素 |
| WeakSet.prototype.delete(value)
| 删除元素 |
| WeakSet.prototype.has(value)
| 判断是否存在该元素,返回布尔值 |
回到顶部 目录
WeakSet 没有size属性,没有办法遍历它的成员(不能遍历是因为成员都是弱引用,随时随地可能消失)
-
是储存 DOM 节点,而不用担心这些节点从文档移除时,会引发内存泄漏
-
完完全全实现一个构造函数
const w = new WeakSet();