ES6新增的数据类型主要有Symbol、Map、Set、WeakMap和WeakSet:Symbol是唯一原始标识符,不可枚举;Map支持任意类型键并保持插入顺序;Set自动去重且基于SameValueZero比较;WeakMap和WeakSet仅接受对象且为弱引用,无size属性、不可遍历。

ES6 新增的数据类型主要有 Symbol、Map、Set、WeakMap 和 WeakSet。它们不是“全新底层类型”,而是语言层面新增的原生构造器,各自有明确的行为特征和使用边界。检测其行为,关键在于理解它们的创建方式、值唯一性、遍历能力、内存管理机制以及与传统对象/数组的差异。
Symbol:唯一标识符,不可枚举也不参与常规遍历
Symbol 是原始类型,每次调用 Symbol() 都返回一个独一无二的值,即使描述相同也互不相等:
-
Symbol('a') === Symbol('a')→ false -
typeof Symbol()→ 'symbol' - 作为对象属性键时,不会出现在
for...in、Object.keys()或JSON.stringify()中 - 需用
Object.getOwnPropertySymbols()或Reflect.ownKeys()才能获取 -
Symbol.for('key')会注册到全局符号注册表,同名可复用;Symbol.keyFor()可反查注册名
Map 与 Object:键类型自由 vs 字符串强制
Map 允许任意类型作键(函数、对象、Symbol),而普通对象只能用字符串或 Symbol(且 Symbol 键仍受限):
-
const m = new Map(); m.set({}, 'value');→ 合法,键是对象 -
m.set(true, 1); m.set(null, 'null');→ 都合法 -
m.size可直接获取长度;Object.keys(obj).length无法反映 Symbol 或非枚举属性 - Map 保持插入顺序,遍历时按添加顺序返回;普通对象属性顺序在 ES2015+ 虽有规范保证,但历史兼容性弱
- Map 提供
.has()、.delete()、.clear()等明确方法,语义清晰
Set:自动去重,值唯一性基于 SameValueZero 比较
Set 存储唯一值,判断重复使用的是 === 规则(除 NaN === NaN 为 true,这是 SameValueZero 的特殊约定):
-
new Set([1, 1, 2, '2', '2'])→{1, 2, '2'}(数字 1 和字符串 '1' 不冲突) -
new Set([NaN, NaN])→{NaN}(只保留一个) -
set.add({})和再次set.add({})会存两个对象(因引用不同) - 支持
.has()、.delete()、扩展运算符转数组:[...set]
WeakMap / WeakSet:弱引用,仅接受对象作为键/值
它们的设计目标是避免内存泄漏,内部引用不阻止垃圾回收:
-
new WeakMap().set('string', 1)→ TypeError(键必须是对象) -
new WeakSet().add(123)→ TypeError(值必须是对象) - 没有
.size、不能遍历(无.keys()、.values()、.entries())、不迭代 - 常用于私有数据绑定:以 DOM 元素为键,存关联元数据,元素被移除后,对应条目自动释放


















