JS中判断数据类型方法汇总

79 阅读2分钟

1. typeof 运算符

  • 适用于基本数据类型(除 null 之外)。
  • 返回一个字符串,表示数据类型。
js
复制编辑
console.log(typeof 42);           // 'number'
console.log(typeof 'hello');       // 'string'
console.log(typeof true);          // 'boolean'
console.log(typeof undefined);     // 'undefined'
console.log(typeof Symbol('sym')); // 'symbol'
console.log(typeof null);          // 'object'  // 特例,历史遗留问题
console.log(typeof []);            // 'object'
console.log(typeof {});            // 'object'
console.log(typeof function() {}); // 'function'

2. instanceof 运算符

  • 判断某个对象是否是某个构造函数的实例,基于原型链。
  • 主要用于复杂对象(数组、对象、日期等)。
js
复制编辑
console.log([] instanceof Array);         // true
console.log({} instanceof Object);         // true
console.log(new Date() instanceof Date);   // true
console.log(function() {} instanceof Function); // true

3. Object.prototype.toString.call()

  • 最精准的类型判断方法。
  • 返回格式为:[object Type]
  • 适用于所有数据类型(包括内置对象)。
js
复制编辑
console.log(Object.prototype.toString.call(42));         // '[object Number]'
console.log(Object.prototype.toString.call('hello'));     // '[object String]'
console.log(Object.prototype.toString.call(true));        // '[object Boolean]'
console.log(Object.prototype.toString.call(undefined));   // '[object Undefined]'
console.log(Object.prototype.toString.call(null));        // '[object Null]'
console.log(Object.prototype.toString.call([]));          // '[object Array]'
console.log(Object.prototype.toString.call({}));          // '[object Object]'
console.log(Object.prototype.toString.call(new Date()));  // '[object Date]'
console.log(Object.prototype.toString.call(/regex/));     // '[object RegExp]'
console.log(Object.prototype.toString.call(Symbol('sym'))); // '[object Symbol]'
console.log(Object.prototype.toString.call(new Map()));   // '[object Map]'
console.log(Object.prototype.toString.call(new Set()));   // '[object Set]'

4. constructor 属性

  • 通过对象的 constructor 属性判断其构造函数。
  • 适用于对象或构造函数生成的实例。
js
复制编辑
console.log((42).constructor === Number); // true
console.log('hello'.constructor === String); // true
console.log(true.constructor === Boolean); // true
console.log([].constructor === Array); // true
console.log({}.constructor === Object); // true
console.log(new Date().constructor === Date); // true

5. Array.isArray()

  • 判断是否为数组。
  • ES5 引入,推荐用于判断数组类型。
js
复制编辑
console.log(Array.isArray([]));       // true
console.log(Array.isArray({}));       // false
console.log(Array.isArray('hello'));  // false

6. isNaN()Number.isNaN()

  • 用于判断是否为 NaN
  • isNaN() 会将参数强制转换为数字再判断。
  • Number.isNaN() 只在值为 NaN 时返回 true(更严格)。
js
复制编辑
console.log(isNaN('abc')); // true ('abc' 会被转换成 NaN)
console.log(Number.isNaN('abc')); // false
console.log(Number.isNaN(NaN)); // true

7. isFinite()Number.isFinite()

  • 用于判断是否为有限数。
  • isFinite() 会将参数强制转换为数字再判断。
  • Number.isFinite() 只在值为有限数时返回 true(更严格)。
js
复制编辑
console.log(isFinite('123')); // true
console.log(Number.isFinite('123')); // false
console.log(isFinite(NaN)); // false
console.log(Number.isFinite(NaN)); // false

8. isInteger()

  • 用于判断是否为整数。
js
复制编辑
console.log(Number.isInteger(42)); // true
console.log(Number.isInteger(42.5)); // false
console.log(Number.isInteger('42')); // false

9. Buffer.isBuffer() (Node.js 专用)

  • 用于判断是否为 Buffer 对象。
js
复制编辑
const buffer = Buffer.from('test');
console.log(Buffer.isBuffer(buffer)); // true
console.log(Buffer.isBuffer([]));     // false

10. typeof null 的特例

  • typeof null === 'object' 是 JavaScript 的历史遗留问题。

推荐方案

用法场景适用性推荐度
typeof基本数据类型(null 除外)简单、快捷⭐⭐⭐
instanceof引用类型(对象、数组、函数)判断对象原型链⭐⭐
Object.prototype.toString.call()精确判断任意数据类型万能方案⭐⭐⭐⭐
constructor构造函数需注意原型链修改⭐⭐
Array.isArray()判断数组最佳方式⭐⭐⭐⭐
Number.isNaN()判断 NaN仅适用于 NaN⭐⭐⭐
Number.isInteger()判断整数适用于数值⭐⭐⭐

🔥 常用方案

  1. 基本数据类型 → typeof
  2. 引用数据类型 → instanceof
  3. 精准判断 → Object.prototype.toString.call()
  4. 数组 → Array.isArray()
  5. NaN → Number.isNaN()
  6. 整数 → Number.isInteger()

👉 推荐使用:

  • typeofArray.isArray() 处理常见类型
  • Object.prototype.toString.call() 作为万能方案
  • Number.isNaN()Number.isFinite() 处理数值类型