喔唷网 - 网络从业者技术信息综合门户!

当前位置: 主页 > 教程技术 > 编程语言 > javascript

JavaScript 中 Map 的使用方法详解

时间 : 2025-04-21 17:19来源 : 喔唷网作者 : 喔唷教程点击 :
Map 是 ES6 引入的键值对集合,相比普通对象,它的键可以是任意类型(对象、函数等),并且保持插入顺序。常用方法包括 set()、get()、has()、delete() 和 clear(),支持 forEach 和 for...of 遍历

1. Map 的基本概念

Map 是 ES6 引入的一种新的数据结构,它类似于对象,也是键值对的集合,但 Map 的键可以是任意类型的值(对象、函数、原始类型等),而传统对象的键只能是字符串或 Symbol。

2. 创建 Map

// 创建一个空的 Map
const map1 = new Map();

// 使用数组初始化 Map
const map2 = new Map([
  ['name', '张三'],
  ['age', 25],
  [1, '数字键'],
  [{}, '对象键']
]);

3. 基本操作方法

添加/设置元素

const map = new Map();
map.set('name', '李四');  // 字符串键
map.set(1, '数字键值');  // 数字键
map.set({id: 1}, '对象键值');  // 对象键

获取元素

map.get('name');  // 返回 '李四'
map.get(1);      // 返回 '数字键值'
map.get('nonexistent');  // 返回 undefined

检查键是否存在

map.has('name');  // true
map.has('age');   // false

删除元素

map.delete('name');  // 删除键为'name'的条目,返回true表示删除成功

清空 Map

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

获取大小

map.size;  // 返回Map中键值对的数量

4. 遍历方法

forEach 方法

map.forEach((value, key) => {
  console.log(key, value);
});

for...of 循环

for (let [key, value] of map) {
  console.log(key, value);
}

// 单独遍历键或值
for (let key of map.keys()) {
  console.log(key);
}

for (let value of map.values()) {
  console.log(value);
}

5. Map 与 Object 的区别

特性MapObject
键的类型任意值字符串或Symbol
顺序插入顺序无序
大小通过size属性获取需要手动计算
性能频繁增删时表现更好少量数据时可能有更好性能
默认属性有原型链上的默认属性
序列化不能直接JSON.stringify可以直接序列化

6. 实际应用示例

示例1:统计字符出现次数

function countChars(str) {
  const charMap = new Map();
  for (let char of str) {
    charMap.set(char, (charMap.get(char) || 0) + 1);
  }
  return charMap;
}

const result = countChars('hello world');
console.log(result.get('l'));  // 3

示例2:缓存计算结果

const cache = new Map();

function expensiveOperation(key) {
  if (cache.has(key)) {
    return cache.get(key);
  }
  
  const result = /* 复杂计算 */;
  cache.set(key, result);
  return result;
}

示例3:存储DOM节点元数据

const nodeMetadata = new Map();

function storeMetadata(node, data) {
  nodeMetadata.set(node, data);
}

function getMetadata(node) {
  return nodeMetadata.get(node);
}

7. 注意事项

  1. Map 的键是基于引用比较的,两个看起来相同的对象作为键会被视为不同的键:const map = new Map(); const obj1 = {id: 1}; const obj2 = {id: 1}; map.set(obj1, 'value1'); map.set(obj2, 'value2'); console.log(map.size); // 2
  2. NaN 作为 Map 的键时会被视为相同的键:map.set(NaN, 'not a number'); map.get(NaN); // 'not a number'
  3. Map 是可迭代对象,可以直接使用扩展运算符:const map = new Map([['a', 1], ['b', 2]]); console.log([...map]); // [['a', 1], ['b', 2]]

Map 提供了比普通对象更强大的键值存储能力,特别适合需要复杂键类型或需要维护插入顺序的场景

栏目列表

关联类容

热点推荐

栏目推荐

猜你喜欢