javascript 的 map 对象专为存储键值对设计,支持任意类型键(包括对象、函数、symbol 等),保留插入顺序,比普通对象更灵活可靠;可通过 new map() 创建或传入键值对数组初始化,用 set() 添加/更新、get() 和 has() 安全检索,支持 for...of 等遍历方式,size 返回数量,键为强引用需注意内存泄漏。

JavaScript 中的 Map 对象专为存储键值对而设计,支持任意类型(包括对象、函数、Symbol、null、undefined 甚至其他 Map)作为键,且保留插入顺序。它比普通对象更灵活、更可靠,尤其适合动态键或非字符串键场景。
创建和初始化 Map
使用 new Map() 创建空 Map;也可传入一个可迭代对象(如数组)进行初始化,每个元素必须是长度为 2 的数组,分别表示键和值:
-
const map = new Map();—— 创建空 Map -
const map = new Map([[1, 'one'], [{}, 'obj-key'], [() => {}, 'func-key']]);—— 初始化含多种类型键 - 注意:传入的数组中,键可以是任意类型,不会被强制转为字符串(不像普通对象的属性名)
添加和更新键值对
用 set(key, value) 方法插入或覆盖键值对。同一个键多次调用 set 会更新值,不会重复添加:
map.set('name', 'Alice');-
map.set({id: 1}, {active: true});—— 对象作键(注意:每次新建对象都是不同键) map.set(Symbol('flag'), true);map.set(undefined, 'no key');
安全检索值
用 get(key) 获取对应值。若键不存在,返回 undefined(不是 null),不会触发错误。判断是否存在应使用 has(key):
map.get('name'); // 'Alice'map.get({id: 1}); // undefined(因为是新对象,与存入的键不相等)map.has(Symbol('flag')); // true- ⚠️ 注意:
Map的键比较基于“SameValueZero”算法,即0 === -0、NaN等价于自身,但对象/函数需是同一引用
遍历和操作 Map
Map 是可迭代对象,支持 for...of、forEach、解构等常用方式:
for (const [key, value] of map) { console.log(key, value); }map.forEach((value, key) => console.log(key, value));Array.from(map.keys()); // 获取所有键的数组[...map.values()]; // 获取所有值的数组map.size; // 返回键值对数量(不是 Object.keys().length)
不复杂但容易忽略:Map 的键是强引用,会影响垃圾回收;如果用大型对象作键又不再需要,记得用 delete(key) 移除,避免内存泄漏。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











