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

Symbol 是 JavaScript 中一种原始数据类型,用来创建唯一、不可变的值,常用于对象属性键,避免命名冲突。
Symbol 的基本特性
每个 Symbol 值都是独一无二的,即使描述(description)相同,它们也不相等:
例如:
const s1 = Symbol('foo');
const s2 = Symbol('foo');
console.log(s1 === s2); // false
立即学习“Java免费学习笔记(深入)”;
Symbol 不会自动转换为字符串(隐式转换会报错),必须显式调用 .toString() 或 String(sym)。
如何用 Symbol 创建唯一对象键
Symbol 作为对象属性名时,能确保该属性不会被意外覆盖或遍历到(常规 for...in、Object.keys() 等都忽略 Symbol 键):
每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的、与操作系统无关的SQL数据库--SQLite,本文介绍的就是如何为你的Android应用程序创建和操作SQLite数据库。 数据库支持每个应用程序无论大小的生命线,除非你的应用程序只处理简单的数据,那么就需要一个数据库系统存储你的结构化数据,Android使用SQLite数据库,它是一个开源的、支持多操作系统的SQL数据库,在许多领域广泛使用,如Mozilla FireFox就是使用SQLite来存储配置数据的,iPhon
- 用
Object.defineProperty()或字面量方式添加 Symbol 属性 - 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() 和 Symbol.keyFor()
如果需要跨模块复用同一个 Symbol,可用全局注册表:
-
Symbol.for('myKey')检查全局注册表,存在则返回,否则新建并登记 -
Symbol.keyFor(sym)返回已登记 Symbol 的键名(仅对Symbol.for()创建的生效)
注意:普通 Symbol('xxx') 每次都新建,不进注册表;Symbol.for('xxx') 同名只生成一次。
常见用途与注意事项
- 定义类的私有方法/属性(虽非真正私有,但可降低误用概率)
- 实现迭代器协议(如
[Symbol.iterator]) - 作为库内部键,防止用户代码污染对象结构
- 不能用作 JSON 序列化字段(会直接被忽略)
- 不参与原型链查找,Symbol 键只在自身对象上有效
基本上就这些。Symbol 不复杂,但容易忽略它的“唯一性”和“不可枚举性”这两个关键点。










