Map和Set是独立集合类型:Map存任意类型键的键值对,Set存唯一值且按SameValueZero判定相等;二者均按插入顺序迭代,而Object键类型受限且顺序不严格。

Map 和 Set 不是语法糖,而是独立的集合类型,各自解决不同问题:Map 存键值对,支持任意类型键;Set 存唯一值,不关心顺序也不存重复项。
Map 的键可以是对象、函数甚至另一个 Map
这是 Object 最大限制的突破——Object 只接受字符串或 Symbol 作键,而 Map 允许任何类型。比如用 DOM 元素当键缓存其状态:
const cache = new Map();
const button = document.querySelector('button');
cache.set(button, { clicked: false, timestamp: Date.now() });
// 后续可直接用 button 查,不会被 toString() 干扰
常见错误是误用 map[key] 访问(这是普通对象写法),Map 必须用 get()、set()、has() 等方法。
- 初始化时传入二维数组:
new Map([['a', 1], ['b', 2]]) -
size是属性,不是方法,别写成map.size() - 遍历时
for...of默认返回[key, value]数组,解构最方便:for (const [k, v] of map) {...}
Set 自动去重,但“相等”按 SameValueZero 判定
Set 对原始值(如数字、字符串)去重很直观,但对对象默认不认为相等:
立即学习“Java免费学习笔记(深入)”;
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
const s = new Set();
s.add({}); s.add({}); // size === 2,两个空对象被视为不同
这意味着不能靠 Set 去重对象数组,除非先序列化或用 Map 模拟(以 JSON 字符串为键)。另外注意:
-
NaN在Set中只存一份(SameValueZero 规则下NaN === NaN) - 没有
indexOf或find,判断存在用has(),转数组用[...set]或Array.from(set) - 想实现“深去重”,得自己封装,比如
new Set(arr.map(JSON.stringify)).forEach(...)(仅限可安全序列化的对象)
Map 和 Object 互转要小心 key 类型丢失
把 Map 转成普通对象时,非字符串键会被强制转成字符串:
const m = new Map([[{}, 'obj'], [Symbol('s'), 'sym']]);
Object.fromEntries(m); // { '[object Object]': 'obj', 'Symbol(s)': 'sym' }
反过来,Object.entries(obj) 只能提取字符串键和 Symbol 键,且 Symbol 键在 entries() 中会被忽略(除非手动 Object.getOwnPropertySymbols() 补全)。
- 需要保留原始键类型?别转 Object,继续用
Map - 只是临时用,且确定键全是字符串?
Object.fromEntries(map)最简洁 -
Object.keys()/values()/entries()都不适用于Map,那是给普通对象用的
真正容易被忽略的是:Map 的迭代顺序严格按插入顺序,Set 也是;但 Object 的属性顺序在 ES2015+ 虽然也基本稳定,仍可能因引擎优化或 key 类型混用(数字键优先排序)出意外。如果逻辑依赖顺序,别图省事用 Object 代替。










