Symbol()每次调用生成唯一值,不可用new;作为对象属性需方括号访问,不被遍历;Symbol.for(key)实现全局共享,相同key返回同一Symbol,Symbol.keyFor()可查注册表key。

直接创建 Symbol 值
用 Symbol() 函数调用即可生成一个新 Symbol:
- 不传参:
const sym1 = Symbol(); - 带描述字符串(仅用于调试显示,不影响值):
const sym2 = Symbol('user_id');
注意:每次调用都返回**完全不同的值**,哪怕描述相同:Symbol('id') !== Symbol('id')。不能用 new Symbol(),会报错“Symbol is not a constructor”。
作为对象属性键的写法
Symbol 必须用方括号访问,不能用点号:
- 赋值:
obj[sym] = 'secret'; - 读取:
console.log(obj[sym]); - 定义时可用计算属性:
const obj = { [sym]: 'data' };
该属性不会出现在 Object.keys()、for...in 或 JSON.stringify() 中,但可通过 Object.getOwnPropertySymbols(obj) 获取。
立即学习“Java免费学习笔记(深入)”;
用 Symbol.for() 实现全局共享
需要跨文件、跨模块复用同一个 Symbol 时,用 Symbol.for(key):
-
const shared = Symbol.for('auth_token');—— 相同字符串 key 总返回同一 Symbol -
Symbol.for('auth_token') === Symbol.for('auth_token')返回true - key 必须是字符串,否则抛
TypeError
想查某个 Symbol 是否来自全局注册表,以及它的 key 是什么,用 Symbol.keyFor(sym):
-
Symbol.keyFor(shared)返回'auth_token' -
Symbol.keyFor(Symbol('auth_token'))返回undefined(普通 Symbol 不在注册表中)
Symbol.for 和 Symbol() 的关键区别
这是最容易混淆的地方:
-
Symbol('x') === Symbol('x')→ false(每次都新建) -
Symbol.for('x') === Symbol.for('x')→ true(查注册表,复用) -
Symbol('x') === Symbol.for('x')→ false(本质不同)
全局 Symbol 也跨 iframe 共享,适合插件系统、状态标识、统一 action 类型等场景。


















