Symbol 是 JavaScript 中唯一保证值独一无二的原始类型,创建后不可修改且不能用 new 调用;主要用于对象属性名防冲突、私有属性及内置行为钩子(如 Symbol.iterator、Symbol.toPrimitive 等)。

Symbol 是 JavaScript 中唯一能保证“值独一无二”的原始类型,创建后不可修改,也不能用 new 调用。它主要用来当对象属性名,避免命名冲突,也常用于定义私有属性或内置行为钩子(比如迭代、类型转换)。
怎么创建 Symbol
必须调用 Symbol() 函数,不能加 new,否则报错:
-
const s1 = Symbol();—— 最简写法,控制台显示Symbol() -
const s2 = Symbol('id');—— 加描述字符串,便于调试,s2.toString()返回Symbol(id),但描述不影响相等性 -
const s3 = Symbol.for('shared');—— 从全局注册表中查找或创建,相同字符串返回同一个 Symbol,适合跨模块共享
Symbol 作为对象属性名的用法
Symbol 可以当键名使用,但访问时只能用方括号 [],不能用点号 .:
const key = Symbol('name'); const obj = { [key]: 'Alice' }; console.log(obj[key]); // 'Alice'- 该属性不会出现在
for...in、Object.keys()、JSON.stringify()中,具有“隐藏性” - 可用
Object.getOwnPropertySymbols(obj)或Reflect.ownKeys(obj)获取 Symbol 键
常见内置 Symbol 和用途
ES6 预定义了一批以 Symbol. 开头的全局 Symbol,用于定制对象行为:
立即学习“Java免费学习笔记(深入)”;
-
Symbol.iterator:让对象支持for...of,例如自定义类返回迭代器 -
Symbol.toPrimitive:控制对象转原始值(如+obj、String(obj))时的行为 -
Symbol.hasInstance:重写instanceof的判断逻辑 -
Symbol.toStringTag:影响Object.prototype.toString.call(obj)的输出结果
注意类型转换和比较限制
Symbol 是原始类型,但不能隐式转成字符串或数字:
-
console.log('prefix' + Symbol('x'))→ 报错:TypeError -
`${Symbol('x')}`→ 同样报错;必须显式调用.toString() - 任意两个 Symbol 永远不相等(
===返回false),哪怕描述相同 - 全局 Symbol 可用
Symbol.keyFor(sym)查其注册键名;非全局的返回undefined


















