0Pricing
JavaScript Academy · 课时

全局 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 创建唯一 Symbol
  2. 将 Symbol 用作对象键
  3. 全局 Symbol 注册表
  4. 众所周知的 Symbol
← 返回 JavaScript Academy