js判断数据类型的方法

2 阅读3分钟

推荐的最佳实践

  1. 判断基本类型:使用 typeof
  2. 判断数组:使用 Array.isArray()
  3. 判断对象类型(如数组、日期、正则等):使用 Object.prototype.toString.call()
  4. 判断 nullundefined:直接用 === 比较。

总结:各方法适用场景

方法适用场景优点缺点
typeof基本数据类型(numberstring等)简单快捷无法区分 null 和对象,也无法检测数组
instanceof引用类型(对象、数组、函数等)能检测构造函数的实例依赖原型链,可能受继承影响
Array.isArray()判断数组类型专门针对数组,结果可靠仅限数组
toString.call()所有类型返回详细类型信息,通用性强需要解析返回的字符串
=== null/undefined判断 nullundefined直接准确仅限这两种类型

1. typeof 运算符

typeof 是一个用于检测数据类型的运算符,它返回一个表示数据类型的字符串。

基本用法

typeof 42;       // "number"
typeof "hello";  // "string"
typeof true;     // "boolean"
typeof undefined; // "undefined"
typeof null;     // "object" (注意:null 的类型是 "object",这是一个历史遗留问题)
typeof function(){}; // "function"
typeof {};       // "object"
typeof [];       // "object" (数组也是对象的一种)
typeof Symbol(); // "symbol" (ES6 引入的类型)

特点

  • 可以检测基本数据类型(numberstringbooleanundefinedsymbolbigint)。
  • 对于引用类型(objectarrayfunction),返回 "object""function"
  • 注意:nulltypeof 返回 "object",这是一个已知的 JavaScript 历史遗留问题。

2. instanceof 运算符

instanceof 用于检测一个对象是否是某个构造函数的实例,它检查对象的原型链。

基本用法

class Animal {}
const dog = new Animal();

dog instanceof Animal; // true
dog instanceof Object; // true (因为 Animal 的原型继承自 Object)

const arr = [];
arr instanceof Array;  // true
arr instanceof Object;  // true (数组也是对象的一种)

const num = 42;
num instanceof Number;  // false (原始值类型不是构造函数的实例)

特点

  • 主要用于检测引用类型(对象、数组、函数等)。
  • 检查的是对象的原型链,而不是直接比较构造函数。
  • 不能直接判断原始值类型(如 numberstring)。

3. Array.isArray() 方法

Array.isArray() 是用于判断一个值是否为数组的内置方法。

基本用法

const arr = [];
Array.isArray(arr); // true

const obj = {};
Array.isArray(obj); // false

const arrLike = document.querySelectorAll('div'); // 类数组对象
Array.isArray(arrLike); // false

特点

  • 专门用于检测数组类型,比 typeofinstanceof 更可靠。

4. Object.prototype.toString.call()

通过调用对象的 toString 方法(来自 Object.prototype),可以返回更精确的类型信息。

基本用法

Object.prototype.toString.call(42);                // "[object Number]"
Object.prototype.toString.call("hello");           // "[object String]"
Object.prototype.toString.call(true);              // "[object Boolean]"
Object.prototype.toString.call({});                // "[object Object]"
Object.prototype.toString.call([]);                // "[object Array]"
Object.prototype.toString.call(function(){});      // "[object Function]"
Object.prototype.toString.call(null);              // "[object Null]"
Object.prototype.toString.call(undefined);         // "[object Undefined]"
Object.prototype.toString.call(new Date());        // "[object Date]"
Object.prototype.toString.call(new RegExp(/x/));   // "[object RegExp]"

特点

  • 返回一个形如 "[object Type]" 的字符串,其中 Type 是具体的类型。
  • 可以区分数组、日期、正则等引用类型。
  • 是一种更通用的类型检测方法。

5. 判断 nullundefined 的特殊方法

由于 typeof null 返回 "object",需要额外判断 nullundefined

基本用法

// 判断 null
value === null; // 直接判断

// 判断 undefined
typeof value === "undefined"; // 推荐方式

6. 判断其他类型(如 DateRegExp

对于特定的内置对象类型,可以使用 instanceoftoString 方法。

示例

const date = new Date();
date instanceof Date; // true
Object.prototype.toString.call(date); // "[object Date]"

const regex = /x/;
regex instanceof RegExp; // true
Object.prototype.toString.call(regex); // "[object RegExp]"