JavaScript 中的 Map
是一种用于存储键值对的集合,它与传统的对象(Object
)类似,但提供了更丰富的功能和灵活性。以下是 Map
相关的主要知识点:
1. 基础概念
- 键值对存储:
Map
使用键值对的形式存储数据,任何值(对象或基本类型)都可以作为键或值,而对象的键只能是字符串或符号。 - 有序性:
Map
中的键值对是按插入顺序排列的,这意味着遍历Map
时会按添加顺序返回键值对。 - 键的类型:在
Map
中,键可以是任何类型,包括对象、函数、甚至是undefined
和NaN
。
2. 创建与初始化
- 创建空的
Map
:const map = new Map();
- 使用二维数组初始化
Map
:const map = new Map([ ['key1', 'value1'], ['key2', 'value2'] ]);
3. 基本操作
- 设置键值对:使用
set
方法添加或更新键值对。map.set('key', 'value');
- 获取值:使用
get
方法根据键获取对应的值。如果键不存在,则返回undefined
。const value = map.get('key');
- 检查键是否存在:使用
has
方法检查Map
中是否存在某个键。const hasKey = map.has('key');
- 删除键值对:使用
delete
方法删除某个键值对,成功删除返回true
,否则返回false
。const success = map.delete('key');
- 清空
Map
:使用clear
方法清空所有键值对。map.clear();
4. 遍历 Map
- 遍历键值对:可以使用
for...of
循环、forEach
方法或直接通过迭代器遍历Map
中的键值对。// 使用 for...of for (let [key, value] of map) { console.log(`${key}: ${value}`); } // 使用 forEach map.forEach((value, key) => { console.log(`${key}: ${value}`); });
- 获取键、值或键值对的迭代器:
const keys = map.keys(); // 获取所有键的迭代器 const values = map.values(); // 获取所有值的迭代器 const entries = map.entries(); // 获取所有键值对的迭代器
5. 属性与方法
- 大小 (
size
):size
属性返回Map
中键值对的数量。const size = map.size;
Map
vsObject
:Map
允许非字符串类型的键,而Object
的键只能是字符串或符号。Map
保持键值对的插入顺序,Object
没有顺序。Map
的原型上没有默认的方法或属性,不会像Object
那样继承原型链上的属性。
6. 常见用例
- 对象作为键:可以使用对象作为键来存储复杂的数据结构。
const objKey = { id: 1 }; const map = new Map(); map.set(objKey, 'Some value'); console.log(map.get(objKey)); // 'Some value'
7. WeakMap
WeakMap
:类似于Map
,但其键必须是对象,并且键对值的引用是弱引用,这意味着如果没有其他引用,键值对会被垃圾回收。WeakMap
不支持迭代。
总结起来,Map
在需要高效、有序地存储和检索键值对,且键可以是任意类型时,是比 Object
更为合适的数据结构。