symbol 类型可作为唯一且不可枚举的对象属性名,须用方括号访问;不参与常规遍历和 json 序列化;symbol.for() 实现全局共享,symbol.keyfor() 反向查询键名;适用于伪私有字段与避免命名冲突。

Symbol 类型在 JavaScript 中可以作为对象属性名使用,而且能确保该属性名唯一、不会被意外覆盖或枚举到,特别适合定义私有或内部属性。
Symbol 作为属性名的基本写法
Symbol 值是原始类型,每次调用 Symbol() 都会生成一个**全新且唯一**的值。要把它用作对象属性名,必须用方括号语法([]),不能用点号(.)——因为点号只支持字符串字面量。
-
✅ 正确:
obj[mySymbol] = 'value' -
❌ 错误:
obj.mySymbol = 'value'(这会创建名为 "mySymbol" 的字符串属性,不是 Symbol)
Symbol 属性不会被常规遍历访问到
用 Symbol 定义的属性不会出现在 for...in、for...of 或 Object.keys() 中,也不会被 JSON.stringify() 序列化。它属于“非枚举的、不可遍历的”属性。
-
Object.getOwnPropertyNames(obj):不包含 Symbol 属性 -
Object.getOwnPropertySymbols(obj):专门用来获取所有 Symbol 类型的键 -
Reflect.ownKeys(obj):同时返回字符串键和 Symbol 键
全局 Symbol 注册表:Symbol.for() 和 Symbol.keyFor()
如果需要跨模块共享同一个 Symbol,可以用 Symbol.for(key)。它会在全局 Symbol 注册表中查找,存在就返回,不存在就创建并登记。
-
Symbol.for('id') === Symbol.for('id')→ true -
Symbol('id') === Symbol('id')→ false(每次都是新值) -
Symbol.keyFor(Symbol.for('id'))返回 'id';对私有 Symbol 返回 undefined
实际使用建议
- 用 Symbol 实现类的“伪私有”字段,避免命名冲突(比如
const _cache = Symbol('cache')) - 配合 Object.defineProperty 设置
enumerable: false,进一步控制可见性 - 慎用 Symbol.for(),仅在真正需要跨文件共享时使用,避免全局命名污染
- 调试时可用
console.log(Object.getOwnPropertySymbols(obj))查看 Symbol 属性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











