在JavaScript开发中,变量类型检查是非常常见的操作,不同场景下需要选择合适的检查方式,才能准确得到变量的真实数据类型。下面先介绍几种常用的检查方法。

一、typeof 操作符
typeof是最基础的类型检查方式,返回一个表示数据类型的字符串,适合检查大部分基本数据类型,但存在一些特殊情况。
// 检查基本类型
console.log(typeof 123); // "number"
console.log(typeof "hello"); // "string"
console.log(typeof true); // "boolean"
console.log(typeof undefined); // "undefined"
console.log(typeof null); // "object",这是历史遗留问题,null不是对象
console.log(typeof Symbol("sym")); // "symbol"
console.log(typeof 123n); // "bigint"
// 检查引用类型
console.log(typeof {}); // "object"
console.log(typeof []); // "object",数组无法用typeof区分
console.log(typeof function() {}); // "function",函数是特殊情况二、instanceof 操作符
instanceof用于检查构造函数的prototype属性是否出现在对象的原型链上,主要用来判断引用类型的归属,不适合检查基本类型。
// 检查自定义构造函数实例
function Person(name) {
this.name = name;
}
const p = new Person("张三");
console.log(p instanceof Person); // true
console.log(p instanceof Object); // true,所有对象都继承自Object
// 检查内置引用类型
console.log([] instanceof Array); // true
console.log([] instanceof Object); // true
console.log({} instanceof Object); // true
// 基本类型使用instanceof会返回false
console.log(123 instanceof Number); // false
console.log("hello" instanceof String); // false三、Object.prototype.toString 方法
这种方法可以准确返回变量的具体类型,是兼容性较好的通用检查方式,通过调用Object原型上的toString方法,会返回[object 类型]格式的字符串。
function getType(target) {
return Object.prototype.toString.call(target).slice(8, -1);
}
console.log(getType(123)); // "Number"
console.log(getType("hello")); // "String"
console.log(getType(true)); // "Boolean"
console.log(getType(null)); // "Null"
console.log(getType(undefined)); // "Undefined"
console.log(getType([])); // "Array"
console.log(getType({})); // "Object"
console.log(getType(function() {})); // "Function"
console.log(getType(new Date())); // "Date"
console.log(getType(/reg/)); // "RegExp"四、其他特殊场景的检查方法
针对部分特定类型,还有更精准的检查方式:
- 检查数组:可以使用Array.isArray()方法,这是ES5新增的数组专用判断方法,比instanceof更可靠,不会受iframe等跨上下文环境影响。
- 检查NaN:使用Number.isNaN()方法,相比全局的isNaN,它不会先对参数做类型转换,只有参数本身是NaN才会返回true。
// 数组检查
console.log(Array.isArray([])); // true
console.log(Array.isArray({})); // false
// NaN检查
console.log(Number.isNaN(NaN)); // true
console.log(Number.isNaN("NaN")); // false,全局isNaN会返回true
console.log(isNaN("NaN")); // true五、不同检查方式的适用场景总结
| 检查方式 | 适用场景 | 局限性 |
|---|---|---|
| typeof | 快速检查基本类型(除null外)、区分函数 | 无法区分null、数组、普通对象等引用类型 |
| instanceof | 判断引用类型的构造函数归属 | 不适用基本类型,跨上下文环境下可能失效 |
| Object.prototype.toString | 全类型通用检查,需要准确类型名称时 | 返回的是首字母大写的类型字符串,需要自行处理格式 |
| Array.isArray | 专门检查数组 | 仅能检查数组类型 |
| Number.isNaN | 专门检查NaN值 | 仅能检查NaN,不会做类型转换 |
实际开发中可以根据需求选择对应的检查方式,如果需要通用且准确的类型判断,优先使用Object.prototype.toString封装的检查函数;如果是特定场景的类型判断,使用对应的专用方法会更简洁高效。
JavaScript数据类型检查typeofinstanceofObject.prototype.toString修改时间:2026-06-04 03:36:23