symbol 类型使对象属性在遍历和序列化中天然不可见,仅可通过 object.getownpropertysymbols 或 reflect.ownkeys 获取,需方括号访问,描述字符串仅用于调试,跨模块复用需 symbol.for。

Symbol 类型让对象属性真正“藏起来”——不是靠约定俗成的下划线前缀,而是语言层面对遍历和复制的天然隔离。
Symbol 属性不会出现在常规遍历中
用 Symbol 作键的属性,对 for...in、Object.keys()、Object.getOwnPropertyNames() 和 JSON.stringify() 完全不可见。这跟“私有”无关,是规范定义的行为。
-
for...in只遍历可枚举的字符串键,Symbol 键被跳过 -
Object.keys(obj)返回空数组(若 obj 仅有 Symbol 属性) -
Object.assign({}, obj)不会拷贝 Symbol 属性,目标对象里没有它 -
JSON.stringify(obj)直接忽略 Symbol 键值对,序列化结果里不出现
要访问 Symbol 属性,得用专门方法
隐藏不等于不可达。JavaScript 提供了明确的 API 来发现和操作这些属性:
-
Object.getOwnPropertySymbols(obj):返回一个数组,包含 obj 上所有 Symbol 键 -
Reflect.ownKeys(obj):同时返回字符串键和 Symbol 键(全部自有属性) - 必须用方括号语法
obj[sym]访问,点号语法obj.sym无效
描述字符串只是调试标签,不影响唯一性
写 Symbol('id') 和 Symbol('id') 两次,得到两个完全不同的值。描述字符串只在 console.log() 或 sym.toString() 时显示,用于人工识别,不参与比较或查找。
- 判断相等只能用严格相等
===,且仅当是同一个 Symbol 实例才为 true - 想跨模块复用同一个 Symbol?用
Symbol.for('key'),它从全局注册表取值,相同字符串参数返回同一 Symbol - 对应地,
Symbol.keyFor(sym)能查出该 Symbol 是用哪个字符串注册的(仅限Symbol.for创建的)
实际用途:避免污染与封装内部状态
它不是为了“绝对保密”,而是防止意外覆盖和干扰:
- 给第三方对象加自定义字段时,用 Symbol 键确保不撞车
- 类内部存储缓存、状态标记或回调函数,外部代码无法通过遍历发现它们
- 库作者用 Symbol 定义内部方法名,使用者调用
obj.method()时不会误删或重写底层逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











