JavaScript数据类型检测需分层策略:基础类型用typeof(注意null例外),数组用Array.isArray(),全覆盖高可靠性用Object.prototype.toString.call();特殊场景可叠加判断。

JavaScript数据类型检测没有“一刀切”的万能方法,但有清晰的分层策略:基础类型优先用 typeof,引用类型优先用 Array.isArray() 或 instanceof,而需要全覆盖、高可靠性时,统一走 Object.prototype.toString.call()。
基础类型检测:用 typeof,但要绕开 null
typeof 对 number、string、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 等框架中处理列表数据时,应作为默认前置校验
其他内置引用类型:instanceof 与 toString.call 各有边界
instanceof 适合明确知道构造来源、且运行环境可控的场景,比如判断是否为自定义类实例、Date、RegExp 或第三方库的特定对象(如 AxiosError)。但它不适用于原始值,也受原型链污染或跨上下文影响。
立即学习“Java免费学习笔记(深入)”;
Object.prototype.toString.call() 则是真正的“标准答案”:它读取对象内部不可篡改的 [[Class]] 标签,返回形如 [object Array] 的字符串,封装后可精准识别全部 12+ 种内置类型。
- 推荐封装工具函数:
const type = Object.prototype.toString.call(x).slice(8, -1).toLowerCase() - 能正确区分:
null → "null"、undefined → "undefined"、[] → "array"、/a/ → "regexp"、new Set() → "set" - 缺点是写法略长,但换来的是稳定性——尤其在表单验证、API 数据解析、通用工具库中值得使用
特殊场景补充方案
某些需求需更精细判断,可叠加使用:
- 纯对象检测(排除数组、null、日期等):
x !== null && typeof x === "object" && !Array.isArray(x) && !(x instanceof Date) && !(x instanceof RegExp) - 函数可调用性检查:
typeof fn === "function" && typeof fn.call === "function" - Promise 检测(非标准但实用):
x && typeof x.then === "function" && typeof x.catch === "function"


















