js类型检查需分层:基础类型用typeof(避开null);数组必用array.isarray();全覆盖检测用object.prototype.tostring.call();instanceof仅限同上下文实例判断。

JS 类型检查不能只靠 typeof,它对基本类型友好,但面对 null、数组、日期、正则等就“认不出人”——typeof null 是 "object",typeof [] 也是 "object"。真正可靠的方案得按需分层使用。
基础类型检测:用 typeof,但绕开 null
typeof 对 string、number、boolean、undefined、symbol、bigint 和 function 都能准确返回字符串标识,性能好、兼容强。只需注意两点:
-
typeof x === "number" && !isNaN(x)才算真数字(排除NaN) -
x === null单独判断null,这是最直接可靠的方式 - 检查变量是否存在,优先用
typeof someVar !== "undefined",比someVar !== undefined更安全
数组检测:无条件选 Array.isArray()
别用 typeof arr === "object",也别依赖 arr instanceof Array:
- 前者无法区分普通对象和数组
- 后者在跨 iframe、微前端或不同 JS 上下文里会失效(构造函数不相等)
-
Array.isArray([])返回true,Array.isArray({})返回false,稳定且语义明确
全覆盖高可靠性检测:统一走 Object.prototype.toString.call()
这是目前最全面、最稳定的类型识别方式,能精准区分所有内置类型:
-
Object.prototype.toString.call([])→"[object Array]" -
Object.prototype.toString.call(null)→"[object Null]" -
Object.prototype.toString.call(new Date())→"[object Date]" -
Object.prototype.toString.call(/abc/)→"[object RegExp]"
提取中括号内首字母大写的类型名(如 Array、Date),就能封装出通用判断函数,适合表单校验、API 响应解析等强类型场景。
引用类型实例判断:instanceof 要慎用
instanceof 适合明确知道构造上下文的场景,比如判断某个值是不是 Date 或 Promise 实例:
-
val instanceof Date可靠,但"hello" instanceof String为false(基本类型不是实例) - 跨 iframe 时,
iframe.contentWindow.Array !== Array,导致[].instanceof Array返回false - 它基于原型链查找,所以
[] instanceof Object也为true,容易误判
不复杂但容易忽略











