最可靠方式是结合typeof和null特判;原始类型共7种:string、number、boolean、undefined、symbol、bigint、null;推荐函数准确覆盖全部且避免包装对象误判。

JavaScript中判断一个值是否为原始类型(primitive),最可靠的方式是结合 typeof 和特殊值(null)的处理,因为 typeof null === 'object' 是一个历史遗留bug。
原始类型的完整集合
ES规范定义的原始类型共7种:string、number、boolean、undefined、symbol、bigint、null。注意:虽然 null 在 typeof 中返回 'object',但它语义上属于原始类型。
推荐的通用判断函数
以下函数能准确识别所有7种原始值,且不依赖 Object.prototype.toString 或构造器检查(避免误判包装对象):
function isPrimitive(value) {
const type = typeof value;
return (
type === 'string' ||
type === 'number' ||
type === 'boolean' ||
type === 'undefined' ||
type === 'symbol' ||
type === 'bigint' ||
value === null
);
}
为什么不用 Object(value) !== value?
这种写法看似简洁,但存在隐患:
-
new String('a')、new Number(42)等包装对象会返回false(符合预期) - 但
document.all(非标准、已废弃)在某些环境中表现为“伪原始值”,该方法可能误判 - 可读性差,逻辑不直观,且无法明确覆盖
null的特殊情况
常见误区提醒
避免这些不严谨的写法:
-
typeof value !== 'object'—— 漏掉null,且把function、undefined等也归为“非对象”,但function不是原始类型 -
value != null && typeof value === 'object'取反 —— 把function、array、date都当作“非原始”,但没排除undefined和symbol等 - 用
value.constructor === String等方式 —— 对原始值有效,但对null、undefined报错,且易被篡改
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











