js 检测数据类型 typeof 和 instanceof

29 阅读1分钟

JavaScript 数据类型检测运算符:typeof 和 instanceof

typeof:基本数据类型检测

typeof 运算符适用于检测基本数据类型和函数类型。它返回一个表示数据类型的字符串。以下是 typeof 的一些示例:

jsx
// typeof 示例
console.log(typeof 42);           // "number"
console.log(typeof 'Hello');      // "string"
console.log(typeof true);         // "boolean"
console.log(typeof {});           // "object" (注意:无法区分数组和对象)
console.log(typeof []);           // "object" (同上)
console.log(typeof function(){}); // "function"
console.log(typeof null);         // "object" (这是一个历史遗留问题)
console.log(typeof Symbol());     // "symbol"

缺点

typeof 无法区分数组和对象,因为它们都返回 "object"。为了解决这个问题,可以使用 Array.isArray() 方法来检测数组:

jsx
console.log(Array.isArray({}));    // false
console.log(Array.isArray([]));    // true

instanceof:复杂对象类型检测

instanceof 运算符用于检测复杂对象类型。它返回一个布尔值,表示左侧的对象是否是右侧构造函数的实例。

jsx
// instanceof 示例
console.log([] instanceof Array);     // true
console.log([] instanceof Object);    // true
console.log({} instanceof Object);    // true
console.log(function(){} instanceof Function); // true
console.log(new Date() instanceof Date);       // true
console.log(new Date() instanceof Object);     // true

工作原理

instanceof 通过检查对象的原型链来确定它是否是特定构造函数的实例。如果原型链上存在构造函数的 prototype 属性,则返回 true

更准确的类型检测

为了更准确地检测对象类型,可以使用 Object.prototype.toString.call() 方法:

jsx
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({}));           // "[object Object]"
console.log(Object.prototype.toString.call([]));           // "[object Array]"
console.log(Object.prototype.toString.call(function(){})); // "[object Function]"
console.log(Object.prototype.toString.call(null));         // "[object Null]"
console.log(Object.prototype.toString.call(Symbol()));     // "[object Symbol]"

最佳实践

  • 使用 typeof 检测基本数据类型和函数。
  • 使用 instanceof 检测对象是否是特定构造函数的实例。
  • 使用 Array.isArray() 来检测数组。
  • 使用 Object.prototype.toString.call() 进行更准确的类型检测。

通过这些方法,您可以更准确地检测和处理 JavaScript 中的各种数据类型。