将 Symbol 用作对象键
使用 Symbol 创建不会冲突的属性。
将 Symbol 用作对象键 是 CoddyKit 上的免费 JavaScript Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 JavaScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 JavaScript Academy 课程共包含 4 节课。
将符号作为键
符号可以用作对象属性键。由于每个符号都是唯一的,这样的属性不会意外地与任何字符串键发生冲突。
const id = Symbol("id")
const user = {}
user[id] = 123
console.log(user[id])计算符号键
要在对象字面量中使用符号作为键,请将它放在方括号中,作为计算属性名。
const id = Symbol("id")
const user = {
name: "Ann",
[id]: 99
}
console.log(user[id])读取符号属性
您必须持有同一个符号的引用,才能读取它的属性。没有该引用时,这个值实际上是隐藏的。
const secret = Symbol("secret")
const obj = { [secret]: "hidden" }
console.log(obj[secret])不会被 for-in 枚举
for-in 循环会跳过符号键。这样可以让符号属性不参与普通遍历。
const tag = Symbol("tag")
const obj = { a: 1, b: 2, [tag]: 3 }
for (const key in obj) {
console.log(key)
}会被 Object.keys 跳过
Object.keys 只返回字符串键,因此以符号为键的属性同样会被排除在外。
const tag = Symbol("tag")
const obj = { a: 1, [tag]: 2 }
console.log(Object.keys(obj))对 JSON 隐藏
JSON.stringify 会完全忽略符号键,因此它们不会出现在序列化输出中。这使符号适合存储内部元数据。
const meta = Symbol("meta")
const obj = { name: "Bo", [meta]: "internal" }
console.log(JSON.stringify(obj))查找符号键
要列出符号键,请使用 Object.getOwnPropertySymbols,它会返回对象上符号属性组成的数组。
const tag = Symbol("tag")
const obj = { a: 1, [tag]: 2 }
const syms = Object.getOwnPropertySymbols(obj)
console.log(syms.length)避免名称冲突
借助符号键,不同的库可以向同一个对象添加属性,而不必担心相互覆盖,因为它们使用的符号不同。
const libA = Symbol("data")
const libB = Symbol("data")
const shared = {}
shared[libA] = 1
shared[libB] = 2
console.log(shared[libA], shared[libB])符号键与展开
对象展开运算符会复制符号键,这一点不同于 for-in 和 Object.keys。因此克隆对象时,请注意这些键也会被带过去。
const tag = Symbol("tag")
const src = { a: 1, [tag]: 2 }
const copy = { ...src }
console.log(copy[tag])存储类似私有的数据
符号键提供了一种较弱的隐私机制:只有持有该符号的代码才能访问数据,从而让数据不会出现在普通的属性列表中。
const balance = Symbol("balance")
function makeAccount() {
const acct = {}
acct[balance] = 100
return { acct: acct, key: balance }
}
const a = makeAccount()
console.log(a.acct[a.key])删除符号属性
删除符号属性的方式与删除其他属性相同:对符号引用使用 delete 运算符。
const tag = Symbol("tag")
const obj = { [tag]: 5 }
delete obj[tag]
console.log(obj[tag])快速检查
测试您对符号键的了解。
回顾
回顾:符号可以构成安全且隐藏的对象键。
- 对计算符号键使用方括号
- 会被 for-in、Object.keys 和 JSON 跳过
- 通过 Object.getOwnPropertySymbols 列出
- 非常适合存储不会冲突的元数据
const k = Symbol("k")
const o = { [k]: 7 }
console.log(o[k])常见问题解答
「将 Symbol 用作对象键」课时是免费的吗?
是的 — 「将 Symbol 用作对象键」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 JavaScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 JavaScript Academy 课程共包含 4 节课。
「将 Symbol 用作对象键」这节课中我会学到什么?
使用 Symbol 创建不会冲突的属性。 你通过在浏览器中直接运行的动手代码来练习 JavaScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 JavaScript Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 JavaScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「将 Symbol 用作对象键」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 JavaScript Academy 课中编写并运行代码吗?
能。每节 JavaScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 创建唯一 Symbol
- 将 Symbol 用作对象键
- 全局 Symbol 注册表
- 众所周知的 Symbol