以往我们要存储键值对数据时,虽然可以使用对象(Object)来实现,但对象存在一些限制,例如键名必须是字符串或 Symbol,并且难以迭代。为了解决这些问题,ECMAScript 6 引入了 Map 对象,它提供了一种更强大、更灵活的键值对存储机制。
Map 的优势
相较于使用对象进行键值对存储,Map 具有以下优势:
- 任意数据类型作为键: Map 的键可以是任意数据类型,包括对象、函数等,而不仅限于字符串或 Symbol。
- 易于迭代: Map 提供了便捷的迭代方法,可以轻松遍历所有键值对。
- 准确的键值对数量: Map 的 size 属性可以准确获取键值对的数量,而对象需要手动计算。
创建 Map 实例
可以使用 new Map() 构造函数创建一个空的 Map 实例:
const m = new Map();
也可以在创建时初始化 Map 实例,通过传入一个包含键值对数组的可迭代对象:
// 使用嵌套数组初始化
const m1 = new Map([
["key1", "val1"],
["key2", "val2"],
["key3", "val3"]
]);
// 使用自定义迭代器初始化
const m2 = new Map({
[Symbol.iterator]: function*() {
yield ["key1", "val1"];
yield ["key2", "val2"];
yield ["key3", "val3"];
}
});
基本操作
Map 提供了以下常用方法进行操作:
- set(key, value): 添加或更新键值对。
- get(key): 获取指定键的值,如果键不存在则返回 undefined。
- has(key): 检查 Map 中是否存在指定的键。
- delete(key): 删除指定键的键值对。
- clear(): 清空 Map 中的所有键值对。
- size: 获取 Map 中键值对的数量。
const m = new Map();
// 添加键值对
m.set("firstName", "Matt");
m.set("lastName", "Frisbie");
// 获取值
console.log(m.get("firstName")); // 输出:Matt
// 检查键是否存在
console.log(m.has("lastName")); // 输出:true
// 删除键值对
m.delete("firstName");
console.log(m.has("firstName")); // 输出:false
// 获取键值对数量
console.log(m.size); // 输出:1
// 清空所有键值对
m.clear();
console.log(m.size); // 输出:0
链式调用
set() 方法返回 Map 实例本身,因此可以进行链式调用:
const m = new Map()
.set("key1", "val1")
.set("key2", "val2")
.set("key3", "val3");
console.log(m.size); // 输出:3
总结
Map 对象为 JavaScript 提供了一种更强大、更灵活的键值对存储机制。 建议在需要使用键值对存储数据时优先考虑使用 Map。