Map允许任意类型(如对象、函数)作键,因内部用引用相等而非值相等判断键;相同内容但不同引用的对象视为不同键,字面量对象作键会导致无法获取,修改键对象属性不影响查找。

JavaScript 中的 Map 允许使用任意类型作为键,包括对象、函数、甚至其他 Map 或 Set,这和普通对象(只能用字符串或 Symbol 作键)有本质区别。关键在于:**Map 使用“引用相等”判断键是否相同,而不是值相等**。
为什么对象能当 Map 的键?
因为 Map 内部不把键转成字符串,而是直接保存你传入的引用。只要两个变量指向同一个对象实例,Map 就认为是同一个键;哪怕两个对象字面量内容一模一样,只要不是同一引用,就视为不同键。
基本用法示例
你可以直接用一个普通对象、数组,甚至一个空对象作为键:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const map = new Map();
const key1 = { id: 1, name: 'Alice' };
const key2 = { id: 1, name: 'Alice' }; // 和 key1 内容相同,但不是同一引用
map.set(key1, 'user-001');
map.set(key2, 'user-002');
console.log(map.get(key1)); // 'user-001'
console.log(map.get(key2)); // 'user-002'
console.log(map.size); // 2 —— 因为 key1 和 key2 是不同引用
常见陷阱与注意事项
-
不要用字面量对象临时当键:比如
map.set({x: 1}, 'value'),之后无法再取到它,因为每次{x: 1}都创建新对象,引用不同。 -
修改键对象本身不影响 Map 查找:Map 查找只看引用,不看对象内容。即使你 later 改了
key1.name = 'Bob',map.get(key1)依然有效。 -
WeakMap 更适合“绑定元数据”场景:如果你只是想给某个对象附加一些私有信息,且希望该对象被回收时元数据也自动清理,用
WeakMap更安全(但 WeakMap 键只能是对象,且不可遍历)。
实用技巧:用对象键做缓存或映射关系
比如你有一组配置对象,想根据它们快速查对应的处理函数:
立即学习“Java免费学习笔记(深入)”;
const handlerMap = new Map();
const configA = { api: '/users', method: 'GET' };
const configB = { api: '/posts', method: 'POST' };
handlerMap.set(configA, () => fetch('/users'));
handlerMap.set(configB, () => fetch('/posts', { method: 'POST' }));
// 后续可复用 configA 引用准确获取对应函数
const fn = handlerMap.get(configA);
只要确保 config 对象是稳定引用(例如定义为常量、或由工厂函数统一创建并缓存),就能可靠使用。

















