17370845950

javascript的symbol是什么_它如何创建唯一键?
Symbol 是 JavaScript 中唯一且不可变的原始类型,用于创建不会冲突的对象属性键;其值独一无二、不自动转字符串,需显式转换,且 Symbol 键不可枚举、不参与 JSON 序列化与原型查找。

Symbol 是 JavaScript 中一种原始数据类型,用来创建唯一、不可变的值,常用于对象属性键,避免命名冲突。

Symbol 的基本特性

每个 Symbol 值都是独一无二的,即使描述(description)相同,它们也不相等:

例如:

const s1 = Symbol('foo');
const s2 = Symbol('foo');
console.log(s1 === s2); // false

Symbol 不会自动转换为字符串(隐式转换会报错),必须显式调用 .toString()String(sym)

如何用 Symbol 创建唯一对象键

Symbol 作为对象属性名时,能确保该属性不会被意外覆盖或遍历到(常规 for...in、Object.keys() 等都忽略 Symbol 键):

  • Object.defineProperty() 或字面量方式添加 Symbol 属性
  • Symbol 键不会出现在 for...inObject.keys()JSON.stringify()
  • 可通过 Object.getOwnPropertySymbols() 获取所有 Symbol 键

示例:

const id = Symbol('id');
const user = { name: 'Alice', [id]: 123 };
console.log(user[id]); // 123
console.log(Object.keys(user)); // ['name']
console.log(Object.getOwnPropertySymbols(user)); // [Symbol(id)]

全局 Symbol 注册表:Symbol.for() 和 Symbol.keyFor()

如果需要跨模块复用同一个 Symbol,可用全局注册表:

  • Symbol.for('myKey') 检查全局注册表,存在则返回,否则新建并登记
  • Symbol.keyFor(sym) 返回已登记 Symbol 的键名(仅对 Symbol.for() 创建的生效)

注意:普通 Symbol('xxx') 每次都新建,不进注册表;Symbol.for('xxx') 同名只生成一次。

常见用途与注意事项

  • 定义类的私有方法/属性(虽非真正私有,但可降低误用概率)
  • 实现迭代器协议(如 [Symbol.iterator]
  • 作为库内部键,防止用户代码污染对象结构
  • 不能用作 JSON 序列化字段(会直接被忽略)
  • 不参与原型链查找,Symbol 键只在自身对象上有效

基本上就这些。Symbol 不复杂,但容易忽略它的“唯一性”和“不可枚举性”这两个关键点。