ES6中的Map类型是一种储存着许多键值对的有序列表,其中的键名和对应的值支持所有的数据类型。键名的等价性判断是通过调用Object.is()方法来实现的,所以数字5和字符串"5"会被判定为两种类型,可以分别作为独立的两个键出现在程序中。这一点与对象中不一样,因为对象的属性名总会被强制转换为字符串类型。
通过new Map创建,调用set方法传入键名和对应的值,如果要从Map集合中获取信息,可以调用get方法。
let map = new Map();
map.set("title", "Understanding ECMAScript 6");
map.set("year", 2016);
// Understanding ECMAScript 6
console.log(map.get("title"));
// 2016
console.log(map.get("year"));
在对象中,无法用对象作为对象属性的键名,但在Map集合中,却可以
let map = new Map(),
key1 = {}, key2 = {};
map.set(key1, 5);
map.set(key2, 42);
// 5
console.log(map.get(key1));
// 42
console.log(map.get(key2));
在设计语言新标准时,委员会为Map集合与Set集合设计了如下3个通用的方法
let map = new Map();
map.set("name", "Nicholas");
map.set("age", 25);
// 2
console.log(map.size);
// true
console.log(map.has("name"));
// Nicholas
console.log(map.get("name"));
// true
console.log(map.has("age"));
// 25
console.log(map.get("age"));
// 删除元素
map.delete("name");
// false
console.log(map.has("name"));
// undefined
console.log(map.get("name"));
// 1
console.log(map.size);
// 删除元素
map.clear();
// false
console.log(map.has("age"));
// undefined
console.log(map.get("age"));
// 0
console.log(map.size);
可以向Map构造函数传入数组来初始化一个Map集合,这一点与Set集合相似。数组中的每一个元素都是一个子数组,子数组中包含一个键值对的键名与值两个元素。因此,整个Map集合中包含的全是这样的两元素数组:
let map = new Map([["name","Nicholas"],["age",25]]);
// true
console.log(map.has("name"));
// Nicholas
console.log(map.get("name"));
// true
console.log(map.has("age"));
// 25
console.log(map.get("age"));
// 2
console.log(map.size);
Map集合的forEach方法与Set、数组的forEach方法类似,回调函数接受三个参数
let map = new Map([["name", "Nicholas"], ["age", 25]]);
map.forEach(function (value, key, ownerMap) {
console.log(key + " = " + value);
console.log(ownerMap === map);
});
执行结果如下
name = Nicholas
true
age = 25
true
遍历过程中,会按照键值对插入Map集合的顺序将相应信息传入forEach()方法的回调函数,而在数组中,会按照数值型索引值的顺序一次传入回调函数。