ECMAScript 6 以前,在 JavaScript 中实现“键/值”式存储可以使用 Object 来方便高效地完成,也就是使用对象属性作为键,再使用属性来引用值。但这种实现并非没有问题,为此 TC39 委员会专门为“键/值”存储定义了一个规范。
作为 ECMAScript 6 的新增特性,Map 是一种新的集合类型,为这门语言带来了真正的键/值存储机制。Map 的大多数特性都可以通过 Object 类型实现,但二者之间还是存在一些细微的差异。具体实践中使用哪一个,还是值得细细甄别。
使用 new 关键字和 Map 构造函数可以创建一个空映射:
const m = new Map();
如果想在创建的同时初始化实例,可以给 Map 构造函数传入一个可迭代对象,需要包含键/值对数组。可迭代对象中的每个键/值对都会按照迭代顺序插入到新映射实例中(类似于二维数组):
const m = new Map([
["小明", 100],
["小红", 90],
["小兰", 99]
]);
Array.from(m); // [["小明", 100],["小红", 90],["小兰", 99]]
size: 获取Map实例的长度:
const m = new Map([
["小明", 100],
["小红", 90],
["小兰", 99]
]);
m.size; // 3
set(): 给Map实例添加键/值对:
// set()方法返回映射实例,因此可以把多个操作连缀起来
const m = new Map();
m.set("小明", 100).set("小红", 100);
Array.from(m); // [["小明", 100], ["小红", 100]]
get(): 通过键查询值,返回值:
const m = new Map();
m.set("小明", 100).set("小红", 100);
m.get("小红"); // 100
m.get("abc"); // 不存在为undefined
has(): 通过键查询是否存在, 返回布尔值:
const m = new Map();
m.set("小明", 100).set("小红", 100);
m.has("小明"); // true
m.has("abc"); // false
delete(): 删除对应键的数据,返回布尔值,表示是否删除成功:
const m = new Map();
m.set("小明", 100).set("小红", 100);
m.delete("小红"); // true
Array.from(m); // [["小明", 100]]
clear(): 清空Map实例:
const m = new Map();
m.set("小明", 100).set("小红", 100);
m.clear();
Array.from(m); // []
keys(): 返回以插入顺序生成键的迭代器;
values(): 返回以插入顺序生成值的迭代器;
entries(): 返回插入顺序生成[key, value]形式的数组。
// keys()
const m = new Map();
m.set("小明", 100).set("小红", 100);
Array.from(m.keys()); // ['小明', '小红']
// values()
Array.from(m.values()); // [100, 100]
// entries()
Array.from(m.entries()); // [["小明", 100],["小红", 100]]
平常的使用: 比如通过名字快速查找对应的考试成绩。
有的人这时候就要说了,我用对象一样也可以做到呀。嗯~,没毛病。
but,but,如果比较注重性能的话就有必要使用Map了:
对于多数 Web 开发任务来说,选择 Object 还是 Map 只是个人偏好问题,影响不大。不过,对于在乎内存和性能的开发者来说,对象和映射之间确实存在显著的差别。
小shy这篇只介绍一下Map的用法,后续会更新WeakMap,Set 和 WeakSet,谢谢各位观看!