Symbol 是 JavaScript 唯一不可变原始类型,用于创建不冲突的对象属性名;Symbol() 每次返回新值,Symbol.for() 实现全局复用;Symbol 属性不可枚举,需 Object.getOwnPropertySymbols() 获取,JSON.stringify() 默认忽略。

Symbol 是 JavaScript 中一种原始数据类型,专门用于创建唯一、不可变的值,常用来作为对象属性名,避免命名冲突。
用 Symbol() 函数创建唯一标识
每次调用 Symbol() 都会返回一个全新的、与其他任何 Symbol 值都不相等的值,即使描述相同:
-
Symbol('id') !== Symbol('id')—— 返回true,两个 Symbol 不相等 - 描述字符串(如
'id')仅用于调试显示,不影响唯一性,也不是属性名本身 - 可直接用作对象属性:`const obj = { [Symbol('name')]: 'Alice' }`
用 Symbol 作属性名,避免属性覆盖
把 Symbol 作为 key 添加到对象中,能确保该属性不会被意外覆盖或遍历到(常规 for...in 或 Object.keys() 不会访问 Symbol 属性):
- 添加方式:
obj[mySym] = 'value'或字面量写法{ [mySym]: 'value' } - 获取值:
obj[mySym];不能用点号访问(obj.mySym无效) - 检查是否存在:
mySym in obj或Object.getOwnPropertySymbols(obj).includes(mySym)
用 Symbol.for() 实现全局注册与复用
如果需要多个地方共享同一个 Symbol(比如跨模块的通用键),可用 Symbol.for(key):
立即学习“Java免费学习笔记(深入)”;
-
Symbol.for('uid')第一次调用会创建并登记该 Symbol;之后再调用返回同一值 -
Symbol.keyFor(sym)可反查已登记 Symbol 对应的 key 字符串 - 注意:
Symbol.for('uid') !== Symbol('uid')—— 后者是匿名且不登记的
获取对象上的 Symbol 属性
Symbol 属性不会出现在常规枚举中,需显式获取:
-
Object.getOwnPropertySymbols(obj)—— 返回所有自有 Symbol 键的数组 -
Reflect.ownKeys(obj)—— 同时返回字符串键和 Symbol 键(按创建顺序) - JSON.stringify() 默认忽略 Symbol 属性,序列化时需手动处理


















