symbol天生唯一,适合创建私有不冲突的属性名;必须用方括号访问;同描述的symbol也不相等,实现命名隔离;symbol.for()可跨作用域共享;常用于类内部状态隐藏。

ES6 的 Symbol 类型天生就是唯一的,每次调用 Symbol() 都会返回一个独一无二的值,因此它是创建**私有、不冲突的对象属性名**的理想选择。
用 Symbol 作为对象属性键
Symbol 值不能被自动转换为字符串,必须显式用作属性名(不能用点号访问,只能用方括号或解构):
- ✅ 正确写法:
obj[mySym] = "value"或{ [mySym]: "value" } - ❌ 错误写法:
obj.mySym(这访问的是名为 "mySym" 的字符串属性,不是 Symbol)
避免属性名冲突:每个 Symbol 独一无二
即使描述相同,两个 Symbol 也永不相等:
const s1 = Symbol('id');
const s2 = Symbol('id');
console.log(s1 === s2); // false
console.log(s1 == s2); // false
这意味着不同模块或库用 Symbol('id') 定义的属性,不会意外覆盖彼此——真正实现“命名隔离”。
可选:使用 Symbol.for() 实现全局共享 Symbol
如果需要跨文件/作用域复用同一个 Symbol(比如统一的内置行为钩子),可用 Symbol.for(key):
-
Symbol.for('debug')第一次调用会创建并登记该 Symbol;后续再调用同 key 会返回同一个值 -
Symbol.keyFor(sym)可反查已登记 Symbol 的 key(仅对Symbol.for创建的生效)
实际应用小技巧
- 定义类的“内部状态”属性,避免被外部枚举或误改:
class Cache { constructor() { this[Cache._data] = new Map(); } }; Cache._data = Symbol('cache-data'); - 配合
Object.getOwnPropertySymbols()获取所有 Symbol 键,用于调试或序列化控制 - 注意:
for...in、Object.keys()、JSON.stringify()默认忽略 Symbol 属性,天然“隐藏”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











