新增 Set 和 Map 类型

1 Set数据结构

1.1 定义

ES6 提供了新的数据结构 Set,它类似于数组,但是成员的值都是唯一的,没有重复的值。

1.2 Set构造函数

Set 函数可以接受一个数组或者其他可遍历对象作为参数,用来初始化。

// 例一
const s = new Set();
[...s]; // []

// 例二
const set = new Set([1, 2, 3, 4, 4]);
[...set]; // [1, 2, 3, 4]

// 例三
const items = new Set([1, 2, 3, 4, 5, 5, 5, 5]);
items.size // 5

// 例四
const set = new Set(document.querySelectorAll('div'));
set.size // 56

1.3 Set实例的方法和属性

属性名和方法名 描述
size 返回 Set 实例的成员总数。
add() 添加某个值,返回 Set 结构本身。
delete() 删除某个值,返回一个布尔值,表示删除是否成功。
has() 返回一个布尔值,表示该值是否为Set的成员。
clear() 清除所有成员,没有返回值。
keys() 返回键名的遍历器
values() 返回键值的遍历器
entries() 返回键值对的遍历器。
forEach() 使用回调函数遍历每个成员。

1.4 Set 应用

实现数组去重

var arr = [100,200,200,300, 'hello', 'hello', 0, '', true, false, {}, {}];
var newArr = [...new Set(arr)];

2.WeakSet 数据结构

2.1 定义

WeakSet 结构与 Set 类似,也是不重复的值的集合。但是,它与 Set 有两个区别:

1)首先,WeakSet 的成员只能是对象类型数据,而不能是原始类型数据。

2)WeakSet 不可遍历。

2.2 WeakSet 构造函数

作为构造函数,WeakSet 可以接受一个数组或者其他可遍历对象作为参数。该数组的所有成员,都会自动成为 WeakSet 实例对象的成员。

作为参数的数组(或者具有 iterable 接口的其他数据结构)的成员只能是对象。

const ws1 = new WeakSet();

const a = [[1, 2], [3, 4]];
const ws2 = new WeakSet(a);    // WeakSet {[1, 2], [3, 4]}

2.3 WeakSet 实例的方法

方法名 含义
add() 向 WeakSet 实例添加一个新成员
delete() 清除 WeakSet 实例的指定成员。
has() 返回一个布尔值,表示某个值是否在 WeakSet 实例之中。

3. Map数据结构

3.1 定义

它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串—值”的对应,Map结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适。

3.2 Map构造函数

Map 构造函数的参数可以接受一个数组或者其他可遍历对象作为参数,但是要求数组或者其他可遍历对象的成员都是双元素数组,如下所示:

const map1 = new Map();

const map2 = new Map([
  ['name', '张三'],
  ['title', 'Author']
]);

const set = new Set([
  ['foo', 1],
  ['bar', 2]
]);

const map3 = new Map(set);

3.3 Map 实例的方法和属性

方法或属性 含义
size 返回 Map 结构的成员总数
set() 设置键名 key 对应的键值为 value,然后返回整个 Map 结构。
如果 key 已经有值,则键值会被更新,否则就新生成该键。
set 方法返回的是当前的Map对象,因此可以采用链式写法。
get() get 方法读取 key 对应的键值,如果找不到 key,返回undefined。
has() has 方法返回一个布尔值,表示某个键是否在当前 Map 对象之中
delete() delete 方法删除某个键,返回true。如果删除失败,返回false。
clear() clear 方法清除所有成员,没有返回值。
keys() 返回键名的遍历器。
values() 返回键值的遍历器。
entries() 返回所有成员的遍历器。
forEach() 遍历 Map 的所有成员。

5 WeakMap

5.1 定义

WeakMap 结构与 Map 结构类似,也是用于生成键值对的集合,WeakMap 与 Map 的区别有两点:

1)WeakMap只接受对象类型数据作为键名,不接受原始类型数据作为键名。

2)不可遍历。

5.2 WeakMap 构造函数

// WeakMap 可以使用 set 方法添加成员
const wm1 = new WeakMap();
const key = {foo: 1};
wm1.set(key, 2);
wm1.get(key) // 2

// WeakMap 也可以接受一个数组或其他可遍历对象作为参数
const k1 = [1, 2, 3];
const k2 = [4, 5, 6];
const wm2 = new WeakMap([[k1, 'foo'], [k2, 'bar']]);
wm2.get(k2) // "bar"

5.3 WeakMap 实例的方法

方法名 含义
set() 添加或修改值
get() 根据 key,获取 value
has() has 方法返回一个布尔值,表示某个键是否在当前 WeakMap 对象之中
delete() delete 方法删除某个键,返回true。如果删除失败,返回false。

results matching ""

    No results matching ""