typeof检测Symbol变量时始终返回"symbol"字符串。Symbol是ES6引入的原始数据类型,非对象,不能用newSymbol()创建。使用typeof即可准确识别,无需instanceof或toString。Symbol值唯一且不可变,常用于对象属性键。
typeof运算符对ES6 Symbol类型的返回值
作者:技术拾光
时间:2026-06-25
浏览:593
文章目录
先来回答一个常见问题:typeof Symbol() 到底返回什么?答案很简单——字符串 "symbol"。这是 JavaScript 对 ES6 新增原始类型 Symbol 的标准识别方式,没有任何复杂之处。

typeof Symbol() 返回 "symbol",这本身就是设计好的。后续所有 Symbol 值——无论是否带有描述字符串、是否是全局共享的——都返回同样的结果。
Symbol 是原始类型,不是对象
很多人容易被 Symbol 的使用场景带偏:它经常作为对象属性键出现,又具有“不可变”和“唯一性”这些类似对象的特征。但本质上,Symbol 属于原始数据类型(primitive)。typeof 的处理非常明确——直接将其与 "object" 区分开,不会像 null 那样带来历史遗留的歧义。
typeof Symbol()→"symbol"typeof Symbol("desc")→"symbol"typeof Symbol.iterator→"symbol"
与其他类型的返回值保持一致
typeof 对所有原始类型都返回小写字符串标识,Symbol 自然也不例外。它和 number、string、boolean 一样,属于语言层面直接支持的类型检测结果,无需依赖构造函数或原型链,也不必用 instanceof 绕弯路。
- 即使传入了描述字符串(例如
Symbol("foo")),类型依然是"symbol" - 全局 Symbol(例如
Symbol.iterator)同样返回"symbol"
常见误判点提醒
容易混淆的地方,其实与 typeof 本身无关,更多是概念上的模糊:
Symbol()不是普通函数调用——Symbol是工厂函数,但返回值是原始值,不是对象实例- 不能使用
new Symbol(),否则直接抛出TypeError——因为它并不是构造器 typeof null返回"object"是历史遗留问题;而typeof Symbol()返回"symbol"是设计之初就确定的,毫无歧义
实际判断建议
如果需要在代码中做类型分支,最直接的方式就是使用严格相等判断:
if (typeof x === "symbol") { /* 处理 Symbol */ }- 切忌使用
instanceof Symbol——Symbol 不是构造函数,且 Symbol 值不是对象,这样写只会得到false - 也不推荐用
Object.prototype.toString.call(x)来检测,不仅冗余,还多了一步不必要的操作
说到底,对 Symbol 做类型判断,记住 typeof 这个老朋友就足够了。
实用工具推荐
电子包浆
使用 ›绿化、压缩、噪点和虚拟水印,自由调节做旧程度。
图片压缩
使用 ›选择画质和输出格式,预览压缩前后的大小。