在ES6以前,js实现键值式存储可以通过Object来方便高效地完成 作为 ECMAScript 6 的新增特性,Map 是一种新的集合类型,为这门语言带来了真正的键/值存储机制。Map 的大多数特性都可以通过 Object 类型实现,但二者之间还是存在一些细微的差异。具体实践中使用哪一个,还是值得细细甄别


1. 基本API

使用 new关键字和Map构造函数创建一个空的映射

  1. const m = new Map();

如果要在创建的同时对映射进行初始化操作,可以给Map构造函数传入一个可迭代对象(例如对象 通过for in进行迭代,数组 通过for of进行迭代 )需要包含键值对数组。
可迭代对象中的每个键值对都会按照迭代顺序插入到新映射(map)当中

// 使用嵌套数组初始化映射
const m1 = new Map([ 
 ["key1", "val1"], 
 ["key2", "val2"], 
 ["key3", "val3"] 
]); 
alert(m1.size); // 3

初始化后,可以使用set()方法再添加键值对,另外还能使用get()和has()进行查询,可以通过size属性获取映射(map)中的键值对数量,还可以使用delete()和clear()删除值。

const m =new Map()  //创建映射

get()和has()查询

alert(m.has("firstName")); // false      
alert(m.get("firstName")); // undefined 
alert(m.size); // 0

set()进行添加

m.set("firstName", "Matt") 
 .set("lastName", "Frisbie");

alert(m.has("firstName")); // true 查询到返回true
alert(m.get("firstName")); // Matt  返回查询到的属性值
alert(m.size); // 2   当前映射(map)内部有2个键值对

set()方法返回映射实例,因此可以把多个操作连缀起来,包括初始化声明:

const m = new Map().set("key1", "val1");

m.set("key2", "val2") 
 .set("key3", "val3"); 

alert(m.size); // 3

delete()进行删除

m.delete("firstName"); // 只删除这一个键/值对

alert(m.has("firstName")); // false   查询不存在 返回false
alert(m.has("lastName")); // true   
alert(m.size); // 1   当前映射内还剩1个键值对

clear()删除所有键值对

m.clear(); // 清除这个映射实例中的所有键/值对

alert(m.has("firstName")); // false 
alert(m.has("lastName")); // false 
alert(m.size); // 0

与 Object 不同,Map 可以使用任何 JavaScript 数据类型作为键.基本上相当于使用严格对象相等的标准来检查键的匹配性。与 Object 类似,映射的值是没有限制的。

new Map([['name', 'bear'],[['grade','class'], [1,3]]])
方法名 作用 备注
set() 增加键值对
get() 获取某个键对应的值
has() 判断某个键是否存在
delete() 删除某个键值对
clear() 清空
size 属性,获取键值对个数
keys() 获取所有的键 静态方法
values() 获取所有的值 静态方法
entries() 获取所有的键以及值 静态方法
forEach() 遍历所有键值对