Symbol 是 JavaScript 中唯一且不可变的原始类型,用于创建不会冲突的对象属性键;其值独一无二、不自动转字符串,需显式转换,且 Symbol 键不可枚举、不参与 JSON 序列化与原型查找。
Symbol 是 JavaScript 中一种原始数据类型,用来创建唯一、不可变的值,常用于对象属性键,避免命名冲突。
每个 Symbol 值都是独一无二的,即使描述(description)相同,它们也不相等:
例如:
const s1 = Symbol('foo');
const s2 = Symbol('foo');
console.log(s1 === s2); // false
Symbol 不会自动转换为字符串(隐式转换会报错),必须显式调用 .toString() 或 String(sym)。
Symbol 作为对象属性名时,能确保该属性不会被意外覆盖或遍历到(常规 for...in、Object.keys() 等都忽略 Symbol 键):
Object.defineProperty() 或字面量方式添加 Symbol 属性for...in、Object.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('myKey') 检查全局注册表,存在则返回,否则新建并登记Symbol.keyFor(sym) 返回已登记 Symbol 的键名(仅对 Symbol.for() 创建的生效)注意:普通 Symbol('xxx') 每次都新建,不进注册表;Symbol.for('xxx') 同名只生成一次。
[Symbol.iterator])基本上就这些。Symbol 不复杂,但容易忽略它的“唯一性”和“不可枚举性”这两个关键点。