ES6 Set & Map
Set
ES6 提供了新的数据结构 Set 。它类似于数组,但其成员的值是唯一的,不会重复。
Set 的简单使用:
// 单个添加
const s = new Set();
[2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x));
for (let i of s) {
console.log(i);
}
// 2 3 5 4
// 将数组转换为 set 对象
const set = new Set([1, 2, 3, 4, 4]);
[...set]
// [1, 2, 3, 4]
方法
| 方法 | 作用 |
|---|---|
| 对内容的操作 | - |
add(value) |
添加某个值,返回 Set 结构本身。 |
delete(value) |
删除某个值,返回一个布尔值,表示删除是否成功。 |
has(value) |
返回一个布尔值,表示该值是否为 Set 的成员。 |
clear() |
清除所有成员,没有返回值。 |
size() |
返回 Set 实例的成员总数。 |
| 遍历操作 | - |
keys() |
返回键名的遍历器 |
values() |
返回键值的遍历器 |
entries() |
返回键值对的遍历器 |
forEach() |
使用回调函数遍历每个成员 |
注: 由于 Set 结构没有键名,只有键值(或者说键名和键值是同一个值),所以 keys 方法和 values 方法的行为完全一致。
Map
Map 类似于对象,也是键值对的集合,但是 键 的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了 字符串—值 的对应,Map 结构提供了 值—值 的对应,是一种更完善的 Hash 结构实现。当你需要 键值对 的数据结构,Map 比 Object 更合适。
Map 的简单使用:
const m = new Map();
const o = 'keyName';
m.set(o, 'content');
m.get(o); // "content"
m.has(o); // true
m.delete(o); // true
m.has(o); // false
const map = new Map([
['name', '张三'],
['title', 'Author']
]);
map.size; // 2
map.has('name'); // true
map.get('name'); // "张三"
map.has('title'); // true
map.get('title'); // "Author"
方法
| 方法 | 作用 |
|---|---|
| 对内容的操作 | - |
size |
返回 Map 结构成员数 |
set(key, value) |
为 Map 设置键名为 key 键值为 value |
get(key) |
读取键名为 key 的键值 |
has(key) |
判断某个键名是否在 Map 中存在,返回 Boolean |
delete(key) |
删除某个键 |
clear() |
清空整个 Map |
Map 的结构和 Set 类似,遍历方法和 set 一致。唯一不同的是:map 存的键值对,拥有正确的 keys 方法和 values 方法。
Weak
ES6 在推出 Set 与 Map 的同时,也推出了两个类似的类:WeakSet 与 WeakMap。
这两个对象仅有 Set 与 Map 的部分效果,并且其内部使用到的对象会直接被 JavaScript 的 GC 忽略。
需要注意的点:
WeakSet不能添加基础类型,仅能添加对象(引用类型)。WeakMap的键不能为基础类型,仅能使用对象(引用类型)。WeakSet仅有add、delete、has三个方法,且是不可迭代对象(不能被 for...of、扩展运算符使用)。WeakMap仅有get、set、has、delete四个方法,且是不可迭代对象。
由于会直接被 GC 所忽略,因此在某些方面会有特殊的用途。