执行 typeof Symbol() 返回字符串 "symbol",这是 JavaScript 对 ES6 新增原始类型 Symbol 的标准识别方式;Symbol 是原始类型,不是对象,typeof 明确将其与 "object" 区分开,且对所有 Symbol 值(无论有无描述、是否全局)均返回 "symbol"。
执行 typeof Symbol() 返回字符串 "symbol",这是 JavaScript 对 ES6 新增原始类型 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.iterator)同样返回 "symbol"
容易混淆的地方主要来自语义或使用场景,而非 typeof 本身的行为:
Symbol() 不是函数调用——Symbol 是工厂函数,但返回值是原始值,不是对象实例new Symbol() —— 会抛出 TypeError,因为它不是构造器typeof null 返回 "object" 是历史遗留问题;而 typeof Symbol() 返回 "symbol" 是设计明确、无歧义的若需在代码中做类型分支,可直接用严格相等判断:
if (typeof x === "symbol") { /* 处理 Symbol */ }instanceof Symbol,因为 Symbol 不是构造函数,且 Symbol 值不是对象Object.prototype.toString.call(x) 来检测,既冗余又不必要