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() | 判断整数 | 适用于数值 | ⭐⭐⭐ |
🔥 常用方案
- 基本数据类型 →
typeof - 引用数据类型 →
instanceof - 精准判断 →
Object.prototype.toString.call() - 数组 →
Array.isArray() - NaN →
Number.isNaN() - 整数 →
Number.isInteger()
👉 推荐使用:
typeof和Array.isArray()处理常见类型Object.prototype.toString.call()作为万能方案Number.isNaN()和Number.isFinite()处理数值类型