ES6 Set & Map
JS 终于迎来了正规的 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 所忽略,因此在某些方面会有特殊的用途。