Skip to content

Map

Map 集合

Map是ES6新增的集合类型,为这门语言带来了真正的键值存储机制。

基本用法

js
// 创建空集合
const m = new Map();

// 使用嵌套数组初始化
const m1 = new Map([
    ["key1", "val1"],
    ["key2", "val2"]
]);

// 添加键值对
m.set("key1", "val1");

// 根据key判断指定元素是否存在
m.has("key1");

// 根据key获取指定元素
m.get("key1");

// 获取键值对数量
m.size;

// 根据key删除指定元素
m.delete("key1");

// 清空所有键值对
m.clear();

TIP

  • Map可以使用任何JavaScript数据类型作为键,并且Map映射的值也是没有限制的。
  • Map内部使用SameValueZero(基本相当于使用严格相等)来检查键的匹配性。

迭代集合

与Object类型的一个主要差异是,Map实例会维护键值对的插入顺序,因此可以根据插入顺序执行迭代操作。

js
const m = new Map([
    ["key1", "val1"],
    ["key2", "val2"],
    ["key3", "val3"]
]);

// 通过entries()方法获取默认迭代器
for (const pair of m.entries()) {
    console.log(pair);
}

// 直接使用扩展操作符
const result = [...m];

m.forEach((val: string, key: string) => {
    console.log(`${key} -> ${val}`)
});

// 通过keys()方法获取以插入顺序生成键的迭代器
for (const key of m.keys()) {
    console.log(key);
}

// 通过values()方法获取以插入顺序生成值的迭代器
for (const val of m.values()) {
    console.log(val);
}

Object vs Map

  • 内存占用:对于相同数量的键值对,Map大约比Object多存储50%的键值对。
  • 插入性能:如果涉及大量插入操作,Map性能更佳。
  • 查找速度:如果涉及大量查找操作,某些情况下(例如使用连续整数作为属性)Object更好。
  • 删除性能:如果涉及大量删除操作,毫无疑问应该选择Map。