javascript中原始值共7种:string、number、boolean、null、undefined、symbol、bigint;其余所有值(包括函数、数组、日期等)均为合成值,判断时需用typeof配合显式排除null。

JavaScript 中判断数据类型是否为原始值(primitive)还是合成值(object),关键在于理解 7 种原始类型 和其余所有值都属于对象(包括函数、数组、日期等,哪怕看起来像“简单值”的 null 也属于对象范畴——这是历史遗留的 typeof null === "object" 的坑)。
原始值有哪些?直接记住这 7 个
ES2022 起,JavaScript 共有以下 7 种原始值类型:
stringnumberboolean-
null(注意:typeof null返回"object",但它确实是原始值) undefined-
symbol(ES6 新增) -
bigint(ES2020 新增)
其余所有值,比如 Array、Object、Function、Date、RegExp、Map、Set、Promise,甚至 new Number(42) 这类包装对象,都是合成值(即对象类型)。
用 typeof + 特殊处理 null 判断原始值
typeof 对大部分原始值返回准确结果,唯独 null 是例外。所以稳妥判断「是否为原始值」可这样写:
function isPrimitive(value) {
const type = typeof value;
return type === "string" ||
type === "number" ||
type === "boolean" ||
type === "undefined" ||
type === "symbol" ||
type === "bigint" ||
value === null;
}
这个函数覆盖全部 7 种原始值,且逻辑清晰、无依赖、不误判。
合成值的判断:先排除原始值,再确认是对象
合成值本质就是「非原始值」且「非函数」?不对——函数也是对象(typeof function(){} === "function",但函数属于 Object 的子类型)。更准确的说法是:
- 合成值 = 所有
typeof返回"object"或"function"的值 - 但要注意:
null虽然typeof null === "object",它却是原始值,必须单独排除
因此判断是否为合成值可写为:
function isObjectish(value) {
const type = typeof value;
return (type === "object" || type === "function") && value !== null;
}
这个判断能正确识别数组、普通对象、类实例、函数、正则、日期等所有合成值,且把 null 安全排除。
补充:别依赖 instanceof Object 或 Object.prototype.toString 来分原始/合成
虽然 Object.prototype.toString.call(x) 能精确识别具体类型(如 [object Array]),但它不能直接告诉你“是不是原始值”;而 x instanceof Object 对原始值的包装对象(如 new String("a"))返回 true,对字面量字符串却返回 false,容易引发混淆。所以日常做原始 vs 合成判断时,优先用 typeof 配合 null 显式检查,最直接可靠。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











