ES6中的Map集合
ES6中的Map类型是一种存储着许多键值对的有序列表。其中最为重要的是:Map集合的键名和值支持任意类型的数据
基本语法
// 创建map对象
let map = new Map();
// set() 设置键值对
map.set('title', 'map title');
// get() 获取键对应的值, 不存在则返回undefined
map.get('title'); // map title
对与Map集合的基础语法很简单,这里我们需要注意一点是,因为Map集合内支持所有的数据类型,所以我们可以这么做:
let map = new Map();
let obj1 = {};
let obj2 = {};
map.set(obj1, 1);
map.set(obj2, 2);
// 获取值
map.get(obj1); // 1
map.get(obj2); // 2
这里,我们定义了两个空对象(虽然看起一样,但是完全是两个不同的东西),并将这两个对象作为键名,分别赋值1和2,然后通过get
方法去获取刚刚设置的值。整个过程是完全合法的,这在对象中是无法实现的。
当然,这里通过定义一个变量来指向了对应的变量,如果你尝试直接map.set({}, 1)
的形式来定义,然后通过map.get({})
是无论如何都拿不到的。
到这里,相信我们已经见识到了Map集合确实可以设置任意类型的数据,换句话说,我们以后不再需要修改对象本身就可以为其添加一些附加信息。
Map集合的其他方法
和Set集合一样,Map集合中也有3个通用的方法, 直接看代码:
let map = new Map();
// has(key): 检测键名是否存在
map.has('title');
// delete(key): 删除指定的键名和其值
map.delete('title');
// clear(): //清空所有键值对
map.clear();
除了上面的三个方法,Map集合还有一个size
属性,用于表明集合中的键值对数量,可以理解成数组中的length
属性。
批量添加
我们知道通过
set
方法可以为Map集合 添加键值对,但是每添加一次都要写一次set
,未免太过麻烦。幸运的是,Map支持批量初始化数据,如同初始化对象和数组一样。
// 通过传入一个二维数组来批量初始化
// let map = new Map([['键名', '值'], ['键名', '值']]);
let map = new Map([['name', 'hxc'], ['age', '22']]);
map.get('name'); //hxc
map.get('age'); // 22
虽然第一眼看起来可能比较混乱,其实理清了很容易理解。批量初始化的时候,我们需要传递一个数组,数组中又包含着多个子数组,子数组中元素个数始终为2,第一个元素为键名,第二个元素为值。
之所以这么设计,是因为Map集合支持所有的数据类型,这样做就是为了正确的去初始化数据。
forEach() 方法
Map集合也支持forEach方法,分别接收3个参数:
- 集合中下一次索引的位置
- 键名
- map集合本身
forEach本身并无发杂的语法,这里我们需要知道的是,在遍历过程中,会按照数据插入到Map集合中的先后顺序来遍历,而在数组中,则是按照索引位置。