如何通过编程方式获取JavaScript的原始类型列表
结论
JavaScript 没有在语言层面暴露可直接编程获取的完整原始类型列表,也没有提供内置方法直接判断某个字符串是否为合法的原始类型标识。
具体说明
- ECMAScript 规范虽然明确定义了截止ES2024版本的全部7种原始类型:
string、number、boolean、null、undefined、bigint、symbol,但从未将这个类型集合作为公开API暴露,不存在类似Object.getPrimitiveTypes()这类可以直接拿到全量列表的原生方法。 - 所有试图通过原生API间接推导原始类型列表的方式都存在缺陷,无法得到准确结果:
- 靠
typeof运算符收集返回值的方案,会因为typeof null === 'object'这个从JS诞生之初就存在的历史遗留bug,无法正确识别null这个原始类型;同时typeof对函数会返回'function',但函数本质是对象类型,不属于原始类型,会混入错误结果。
可以跑下测试代码直观看到问题:const collected = new Set(); collected.add(typeof ''); collected.add(typeof 1); collected.add(typeof true); collected.add(typeof undefined); collected.add(typeof 1n); collected.add(typeof Symbol()); collected.add(typeof null); console.log([...collected]); // 输出: ["string", "number", "boolean", "undefined", "bigint", "symbol", "object"] // 既缺少正确的'null'类型标识,还混入了代表对象类型的'object' - 靠
Object.prototype.toString识别的方案更不可靠,它返回的是[object Xxx]格式的字符串,本身不会区分原始类型和对象类型,而且返回值还可以通过对象上的Symbol.toStringTag属性自定义篡改,完全无法作为准确判断的依据。
- 靠
- 目前要获取完整原始类型列表、或者校验字符串是否为合法原始类型标识,最可靠、维护成本最低的方案还是硬编码类型集合。原始类型的新增是非常重大的语言标准变更,频率极低(上一次新增原始类型是2020年ES2020加入的
bigint,再上一次是2015年ES6加入的symbol),硬编码不需要频繁修改。参考实现:const PRIMITIVE_TYPES = Object.freeze([ 'string', 'number', 'boolean', 'null', 'undefined', 'bigint', 'symbol' ]); function isLegalPrimitiveType(type) { return PRIMITIVE_TYPES.includes(type); }
内容的提问来源于stack exchange,提问作者Allxie
相关产品推荐
相关产品推荐

