Set
Set函数可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用来初始化。
- set中判断数据是否不同,类似于 ===
- NaN是相等的
- 两个对象总是相等的
set方法
Set.prototype.add(value) | 添加某个值,返回 Set 结构本身 |
Set.prototype.delete(value) | 删除某个值,返回一个布尔值,表示删除是否成功 |
Set.prototype.has(value) | 返回一个布尔值,表示该值是否为Set的成员 |
Set.prototype.clear() | 清除所有成员,没有返回值 |
Array.from(set) | 将 Set 结构转为数组 |
set遍历
注意:Set的遍历顺序就是插入顺序
- 由于set的结构,所以
keys
values
都是一样的 - Set 结构的实例可遍历,它的默认遍历器生成函数就是它的
values
方法,Set不太需要这几个方法
Set.prototype.keys () | 返回键名的遍历器 |
Set.prototype.values () | 返回键值的遍历器 |
Set.prototype.entries () | 返回键值对的遍历器 |
Set.prototype.forEach () | 使用回调函数遍历每个成员 |
扩展运算符(…) 内部使用for…of循环
所以set可以使用...
遍历
let set = new Set(['red', 'green', 'blue']);
let arr = [...set];
set实现并集,交集,差集
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
- 也是不重复的值的集合
- WeakSet 的成员只能是对象,而不能是其他类型的值。
- WeakSet 中的对象都是弱引用(适合适合临时存放一组对象)
- WeakSet 不可遍历(因为弱引用,随时可能消失)
WeakSet 是一个构造函数,可以使用new
命令,创建 WeakSet 数据结构。
注意:使用构造函数,WeakSet传入数组或者类似数组的对象
作为参数,参数的成员会自动成为WeakSet的成员,而不是成员本身,所以参数的成员必须是数组
const a = [[1, 2], [3, 4]];
const ws = new WeakSet(a);
WeakSet方法
WeakSet.prototype.add(value) | 向 WeakSet 实例添加一个新成员 |
WeakSet.prototype.delete(value) | 清除 WeakSet 实例的指定成员 |
WeakSet.prototype.has(value) | 返回一个布尔值,表示某个值是否在 WeakSet 实例之中 |
Map
类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适。
Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键
Map构造函数
const map = new Map([
['name', '张三'],
['title', 'Author']
]);
不仅仅是数组,任何具有 Iterator
接口、且每个成员都是一个双元素的数组的数据结构
(详见《Iterator》一章)都可以当作Map构造函数的参数。这就是说,Set和Map都可以用来生成新的 Map。
Map 的键是简单类型 | 则只要两个值严格相等 Map 将其视为一个键 |
---|---|
0和-0 | 就是一个键 |
布尔值true和字符串true | 两个不同的键 |
undefined和null | 两个不同的键 |
NaN和NaN | 同一个键 |
Map的属性和方法
Map.prototype.set(key,value) | 设置键名key对应的键值为value,返回map本身 |
Map.prototype.get(key) | 读取key对应的键值,如果找不到key,返回undefined。 |
Map.prototype.has(value) | 返回一个布尔值,表示某个键是否在当前 Map 对象之中 |
Map.prototype.delete(key) | 删除某个键,返回true。如果删除失败,返回false |
Map.prototype.clear() | clear方法清除所有成员,没有返回值 |
Map的遍历
Map 的遍历顺序就是插入顺序。
Map.prototype.keys () | 返回键名的遍历器 |
Map.prototype.values () | 返回键值的遍历器 |
Map.prototype.entries () | 返回键值对的遍历器 |
Map.prototype.forEach () | 使用回调函数遍历每个成员(forEach方法还可以接受第二个参数,用来绑定this) |
Map 结构转为数组结构,比较快速的方法是使用扩展运算符
结合数组的map方法、filter方法,可以实现 Map 的遍历和过滤
Map转换
Map 转为数组 | 扩展运算符(…) |
数组 转为 Map | 将数组传入 Map 构造函数 |
Map 转为对象 | 所有 Map 的键都是字符串,它可以无损地转为对象。 |
对象转为 Map | 通过Object.entries() |
Map 转为 JSON | 分如下情况 |
WeakMap
- WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名。
- WeakMap的键名所指向的对象,不计入垃圾回收机制。
WeakMap方法
WeakMap.prototype.set(key,value) | 设置键名key对应的键值为value,返回map本身 |
WeakMap.prototype.get(key) | 读取key对应的键值,如果找不到key,返回undefined。 |
WeakMap.prototype.has(value) | 返回一个布尔值,表示某个键是否在当前 Map 对象之中 |
WeakMap.prototype.delete(key) | 删除某个键,返回true。如果删除失败,返回false |