Symbol值默认唯一不可变,Symbol()创建局部唯一Symbol,Symbol.for(key)创建全局共享Symbol,Symbol.keyFor()可反查注册键。

Symbol 类型本身是**唯一且不可变**的原始值,但“全局唯一标识符”这个说法容易误解——Symbol 值默认就是唯一的(每次 Symbol() 都产生新值),而“全局”通常指跨模块、跨文件也能复用同一个 Symbol,这时要用 Symbol.for(key)。
用 Symbol() 创建局部唯一值
这是最常用的方式,每次调用都返回一个全新的、与其他任何 Symbol 不相等的值:
const id1 = Symbol('id');const id2 = Symbol('id');console.log(id1 === id2); // false —— 即使描述相同,也互不相等
适合用作对象私有属性名,避免属性名冲突,比如:
const _cache = Symbol('cache');<br>obj[_cache] = new Map();
用 Symbol.for(key) 创建全局注册的 Symbol
它会先在全局 Symbol 注册表中查找是否已有同名 key 的 Symbol,有则返回,没有则新建并登记:
const s1 = Symbol.for('user-id');const s2 = Symbol.for('user-id');console.log(s1 === s2); // true —— 全局共享同一个 Symbol
注意:Symbol('user-id') 和 Symbol.for('user-id') 完全不同,前者是局部唯一,后者是全局复用。
立即学习“Java免费学习笔记(深入)”;
用 Symbol.keyFor(sym) 查看注册的 key
仅对通过 Symbol.for() 创建的 Symbol 有效,可反查其注册时用的字符串键:
const sym = Symbol.for('debug-mode');console.log(Symbol.keyFor(sym)); // 'debug-mode'console.log(Symbol.keyFor(Symbol('debug-mode'))); // undefined
实际使用建议
多数场景下,用 Symbol() 就够了;只有当你需要多个模块协作、约定使用同一个 Symbol(比如自定义迭代器 [Symbol.iterator] 或其他规范符号)时,才考虑 Symbol.for()。不过要注意命名空间污染风险,建议加前缀,如 'mylib:config'。


















