全局 Symbol 注册表
使用 Symbol.for 和 keyFor 共享 Symbol。
全局 Symbol 注册表 是 CoddyKit 上的免费 JavaScript Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 JavaScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 JavaScript Academy 课程共包含 4 节课。
共享注册表
全局符号注册表允许您根据键创建整个程序共享的符号,而不必让符号始终保持唯一。
const a = Symbol.for("app.id")
const b = Symbol.for("app.id")
console.log(a === b)Symbol.for
Symbol.for 会根据字符串键在注册表中查找符号。如果符号已经存在,就返回它;否则会创建一个新符号并将其存储起来。
const token = Symbol.for("token")
console.log(token.description)共享身份
与普通的 Symbol 调用不同,使用相同键的两次 Symbol.for 调用会返回完全相同的符号,因此它们比较结果相等。
const x = Symbol.for("shared")
const y = Symbol.for("shared")
console.log(x === y)与 Symbol 对比
普通的 Symbol 总是创建新的唯一符号,而 Symbol.for 会为相同的键复用注册表中已有的条目。
const local1 = Symbol("k")
const local2 = Symbol("k")
const global1 = Symbol.for("k")
const global2 = Symbol.for("k")
console.log(local1 === local2)
console.log(global1 === global2)Symbol.keyFor
Symbol.keyFor 执行相反的操作:给定一个注册表符号,它会返回创建该符号时使用的字符串键。
const s = Symbol.for("config")
console.log(Symbol.keyFor(s))keyFor 与本地符号
对于不在注册表中的符号,Symbol.keyFor 会返回 undefined。您可以借此判断某个符号是否为全局符号。
const local = Symbol("private")
const global = Symbol.for("public")
console.log(Symbol.keyFor(local))
console.log(Symbol.keyFor(global))跨模块共享
即使应用程序的不同部分之间(例如不同模块之间),注册表也会保持共享,因此它适合用于各方都认可的协调键。
function getKey() { return Symbol.for("event.bus") }
console.log(getKey() === Symbol.for("event.bus"))命名约定
由于注册表是全局的,请为键添加前缀,以避免与其他库发生冲突,例如使用以应用名称命名的命名空间。
const a = Symbol.for("myapp.user.id")
const b = Symbol.for("myapp.user.id")
console.log(a === b)注册表会持久存在
键一旦注册,程序整个生命周期内,之后每次使用该键调用 Symbol.for 都会返回同一个符号。
Symbol.for("once")
const again = Symbol.for("once")
console.log(Symbol.keyFor(again))何时使用注册表
当不同代码需要通过名称约定使用同一个符号时,请使用注册表。当唯一性和隐私更重要时,请使用普通的 Symbol。
const sharedFlag = Symbol.for("feature.enabled")
const privateFlag = Symbol("feature.enabled")
console.log(sharedFlag === Symbol.for("feature.enabled"))
console.log(privateFlag === Symbol.for("feature.enabled"))与对象键结合使用
注册表符号同样可以用作对象键,从而允许任何协作模块通过重新获取该符号来读取共享元数据。
const META = Symbol.for("meta")
const obj = { [META]: "shared data" }
console.log(obj[Symbol.for("meta")])快速检查
测试您对注册表的了解。
回顾
回顾:全局注册表通过键共享符号。
- Symbol.for 会复用或创建注册表符号
- 相同的键会返回相同的符号
- Symbol.keyFor 会返回键;对于本地符号则返回 undefined
- 为键添加命名空间以避免冲突
const a = Symbol.for("k")
console.log(Symbol.keyFor(a))常见问题解答
「全局 Symbol 注册表」课时是免费的吗?
是的 — 「全局 Symbol 注册表」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 JavaScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 JavaScript Academy 课程共包含 4 节课。
「全局 Symbol 注册表」这节课中我会学到什么?
使用 Symbol.for 和 keyFor 共享 Symbol。 你通过在浏览器中直接运行的动手代码来练习 JavaScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 JavaScript Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 JavaScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「全局 Symbol 注册表」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 JavaScript Academy 课中编写并运行代码吗?
能。每节 JavaScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 创建唯一 Symbol
- 将 Symbol 用作对象键
- 全局 Symbol 注册表
- 众所周知的 Symbol