symbol是javascript中唯一、不可变的原始类型,用于创建不冲突的对象属性键;支持描述参数、全局注册表(symbol.for/keyfor)、内置符号(如symbol.iterator)及私有属性定义。

Symbol 是 JavaScript 中的一种原始数据类型,用来创建唯一、不可变的值,常用于对象属性键,避免命名冲突。
Symbol 的基本用法
调用 Symbol() 函数即可生成一个独一无二的 Symbol 值:
- 每次调用 Symbol() 都返回一个新值,即使描述相同,它们也不相等
- 可选传入字符串作为描述(description),仅用于调试,不影响唯一性
例如:
const sym2 = Symbol('id');
console.log(sym1 === sym2); // false
console.log(sym1.description); // "id"
用 Symbol 作对象属性名
Symbol 可作为对象的键,且不会被 for...in、Object.keys() 或 JSON.stringify() 遍历或序列化,适合定义私有或内部属性:
- 必须用方括号 [] 访问,不能用点号(.sym)
- 可通过 Object.getOwnPropertySymbols() 获取所有 Symbol 类型的键
- Reflect.ownKeys() 同时返回字符串和 Symbol 键
例如:
const user = { name: 'Alice' };const _id = Symbol('id');
user[_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(key) 检查全局注册表中是否存在该 key,有则返回,无则创建并登记
- Symbol.keyFor(sym) 返回已登记 Symbol 对应的 key,对本地 Symbol 返回 undefined
例如:
const s1 = Symbol.for('debug');const s2 = Symbol.for('debug');
console.log(s1 === s2); // true
console.log(Symbol.keyFor(s1)); // "debug"
console.log(Symbol.keyFor(Symbol('debug'))); // undefined
内置 Symbol(Well-known Symbols)
JavaScript 预定义了一些 Symbol 常量,用于自定义对象行为,比如:
- Symbol.iterator:让对象可被 for...of 遍历
- Symbol.toStringTag:影响 Object.prototype.toString() 的输出
- Symbol.hasInstance:自定义 instanceof 的判断逻辑
例如自定义 toString 行为:
class MyClass {get [Symbol.toStringTag]() { return 'MyClass'; }
}
console.log(new MyClass().toString()); // "[object MyClass]"
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











