JavaScript类型判断有清晰路径:基础类型用typeof(null需单独处理),数组用Array.isArray(),其余统一用Object.prototype.toString.call()。

JavaScript类型判断没有统一公式,但有清晰路径:基础类型用typeof(单独处理null),数组用Array.isArray(),其余高可靠性场景统一走Object.prototype.toString.call()。
基础类型判断:用typeof,但绕开null
typeof对string、number、boolean、undefined、symbol、bigint和function返回准确字符串,性能好、兼容强。唯一例外是typeof null === "object"——这是无法更改的历史行为。
- 检测数字:用
typeof x === "number" && !isNaN(x),排除NaN - 判断变量是否存在:用
typeof someVar !== "undefined",比someVar !== undefined更安全 - 识别函数:直接
typeof fn === "function",这是typeof唯一能精准识别的引用类型 - 判断
null:最可靠方式就是x === null,不依赖任何类型运算符
数组判断:无条件选Array.isArray()
别用typeof arr === "object",也别依赖arr instanceof Array。前者无法区分普通对象和数组;后者在跨 iframe 或微前端中会失效(不同上下文的Array构造函数不相等)。
-
Array.isArray([])返回true,Array.isArray({})返回false - ES5 标准方法,所有现代环境支持,语义明确、结果稳定
- React/Vue 等框架中处理列表数据前,应作为默认校验步骤
全覆盖高可靠性:用Object.prototype.toString.call()
它读取对象内部不可篡改的[[Class]]标签,返回形如[object Array]的字符串,能精准识别全部内置类型(包括null、undefined、Set、RegExp等)。
立即学习“Java免费学习笔记(深入)”;
- 推荐封装为工具函数:
const type = Object.prototype.toString.call(x).slice(8, -1).toLowerCase() - 结果示例:
null → "null"、[] → "array"、/a/ → "regexp"、new Date() → "date" - 适合表单验证、API 数据解析、通用工具库等对稳定性要求高的场景
特殊需求可叠加判断
单一方法不能覆盖所有业务逻辑时,组合使用更稳妥:
- 纯对象检测(排除数组、
null、Date等):type === "object" && !Array.isArray(x) && x !== null && !(x instanceof Date) - 函数且可调用:
typeof fn === "function" && typeof fn.call === "function" - 类实例判断(可控环境):
obj instanceof CustomClass,但需注意跨上下文失效风险


















