symbol和bigint均可通过typeof准确识别:typeof symbol()返回'symbol',typeof 10n返回'bigint';二者均为es6/es11引入的原始类型,不会被误判为'object'或'number'。

直接用 typeof 就能识别,两者返回的字符串字面量不同:typeof Symbol() 得到 'symbol',typeof 10n 得到 'bigint'。关键不是“怎么识别”,而是别把它们和其他类型混淆——尤其是别误判为 'object' 或 'number'。
Symbol 类型的识别要点
Symbol 是唯一、不可变的原始值,每次调用 Symbol() 都生成新值。
-
typeof Symbol()→'symbol' -
typeof Symbol('desc')→ 同样是'symbol',描述符不影响类型 -
typeof Symbol.iterator→ 也是'symbol'(它是内置 symbol) - 它不会被当成对象:没有包装对象自动装箱行为(不像
String或Number),new Symbol()会直接报错
BigInt 类型的识别要点
BigInt 用于表示任意精度整数,必须以 n 结尾,不能与普通数字混用。
-
typeof 123n→'bigint' -
typeof BigInt(123)→ 同样是'bigint' -
typeof 123→'number'(注意:没n就不是 BigInt) -
typeof 123.5n→ 语法错误(n只能用于整数字面量) - 它不等于
Number:123n === 123为false,且不能参与浮点运算
为什么这两个能被 typeof 准确识别?
因为它们是 ES6 和 ES11 正式引入的原始类型,typeof 在语言规范中明确支持:
-
Symbol自 ES6 起就拥有独立的 typeof 返回值'symbol' -
BigInt自 ES11(2019)起加入,typeof对n字面量统一返回'bigint' - 它们不受 typeof 对 null/数组/对象一律返回 'object' 的历史缺陷影响
- 也不像
function那样存在语义歧义(typeof把函数单独列为一类)
常见误判提醒
别靠外观或值内容判断,只信 typeof 返回的字符串:
-
typeof Object(Symbol())→'object'(手动包装后就不是原始 Symbol 了) -
typeof +10n→ 报错(BigInt 不能隐式转 number) -
typeof '10n'→'string'(字符串不是 BigInt) -
Symbol() instanceof Object→false(Symbol 是原始值,不是对象实例)










