推荐的最佳实践
- 判断基本类型:使用
typeof。 - 判断数组:使用
Array.isArray()。 - 判断对象类型(如数组、日期、正则等):使用
Object.prototype.toString.call()。 - 判断
null或undefined:直接用===比较。
总结:各方法适用场景
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
typeof | 基本数据类型(number、string等) | 简单快捷 | 无法区分 null 和对象,也无法检测数组 |
instanceof | 引用类型(对象、数组、函数等) | 能检测构造函数的实例 | 依赖原型链,可能受继承影响 |
Array.isArray() | 判断数组类型 | 专门针对数组,结果可靠 | 仅限数组 |
toString.call() | 所有类型 | 返回详细类型信息,通用性强 | 需要解析返回的字符串 |
=== null/undefined | 判断 null 或 undefined | 直接准确 | 仅限这两种类型 |
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 引入的类型)
特点
- 可以检测基本数据类型(
number、string、boolean、undefined、symbol、bigint)。 - 对于引用类型(
object、array、function),返回"object"或"function"。 - 注意:
null的typeof返回"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 (原始值类型不是构造函数的实例)
特点
- 主要用于检测引用类型(对象、数组、函数等)。
- 检查的是对象的原型链,而不是直接比较构造函数。
- 不能直接判断原始值类型(如
number、string)。
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
特点
- 专门用于检测数组类型,比
typeof或instanceof更可靠。
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. 判断 null 和 undefined 的特殊方法
由于 typeof null 返回 "object",需要额外判断 null 和 undefined。
基本用法
// 判断 null
value === null; // 直接判断
// 判断 undefined
typeof value === "undefined"; // 推荐方式
6. 判断其他类型(如 Date、RegExp)
对于特定的内置对象类型,可以使用 instanceof 或 toString 方法。
示例
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]"