检测JavaScript变量类型需组合使用多种方法:typeof适用于基本类型但对null和对象不准确;Array.isArray()是识别数组的首选;Object.prototype.toString.call()最通用精准;instanceof和constructor则存在跨环境或被篡改风险。

JavaScript 检测变量类型不能只靠一种方法,因为每种方式都有明确的适用边界。最稳妥的做法是按需组合使用,而不是找“万能解”。
用 typeof 判断基本类型(但注意 null 和对象)
它对 string、number、boolean、undefined、symbol、bigint、function 返回准确结果,比如:
-
typeof "abc"→"string" -
typeof 42→"number" -
typeof function() {}→"function"
但有两个经典陷阱:
-
typeof null返回"object"(历史 bug,不是错误) -
typeof []、typeof {}、typeof new Date()全部返回"object",无法区分
用 Array.isArray() 单独识别数组
这是检测数组的**首选且最可靠方式**,不依赖原型链,跨 iframe 也安全:
立即学习“Java免费学习笔记(深入)”;
-
Array.isArray([])→true -
Array.isArray({})→false -
Array.isArray(new Array(3))→true
比 [] instanceof Array 更健壮,尤其在多上下文环境里。
用 Object.prototype.toString.call() 精确识别所有内置类型
这是目前最通用、最准确的检测手段,能区分 null、Array、Date、RegExp、Map、Set 等所有标准类型:
-
Object.prototype.toString.call(null)→"[object Null]" -
Object.prototype.toString.call([])→"[object Array]" -
Object.prototype.toString.call(/a/)→"[object RegExp]" -
Object.prototype.toString.call(new Set())→"[object Set]"
可封装成工具函数,例如:
const typeOf = val => Object.prototype.toString.call(val).slice(8, -1).toLowerCase();typeOf([1,2]) // "array"
慎用 instanceof 和 constructor
instanceof 适合判断自定义类或明确构造函数的对象实例,比如 obj instanceof MyClass;但它在跨 iframe 时会失效(因不同环境的 Array 构造函数不相等)。
constructor 属性容易被修改,例如 arr.constructor = String 后就不可信,也不适用于 null 或 undefined(会报错)。


















