3.3 类型检测

3.3 类型检测:typeofinstanceofObject.prototype.toString

在 JavaScript 中,类型检测是开发中常见的需求。由于 JavaScript 是动态类型语言,变量的类型可能会在运行时发生变化。为了准确判断变量的类型,我们可以使用 typeofinstanceofObject.prototype.toString 等方法。本节将详细介绍这些方法的用法和区别。


3.3.1 typeof 操作符

typeof 是 JavaScript 中最常用的类型检测方法,用于返回一个字符串,表示操作数的类型。

1. 基本用法

console.log(typeof 42); // 输出 "number"
console.log(typeof "Hello"); // 输出 "string"
console.log(typeof true); // 输出 "boolean"
console.log(typeof undefined); // 输出 "undefined"
console.log(typeof null); // 输出 "object"(历史遗留问题)
console.log(typeof {}); // 输出 "object"
console.log(typeof []); // 输出 "object"
console.log(typeof function () {}); // 输出 "function"

2. 注意事项

  • typeof null 返回 "object",这是 JavaScript 的历史遗留问题。
  • typeof 无法区分数组和普通对象,它们都返回 "object"

3.3.2 instanceof 操作符

instanceof 用于检测一个对象是否是某个构造函数的实例,适用于检测引用类型。

1. 基本用法

console.log([] instanceof Array); // 输出 true
console.log({} instanceof Object); // 输出 true
console.log(function () {} instanceof Function); // 输出 true

2. 原型链检测
instanceof 会沿着原型链向上查找:

function Person() {}
let alice = new Person();
console.log(alice instanceof Person); // 输出 true
console.log(alice instanceof Object); // 输出 true

3. 注意事项

  • instanceof 只能用于检测对象,不能用于检测原始类型:
    console.log(42 instanceof Number); // 输出 false
    

3.3.3 Object.prototype.toString 方法

Object.prototype.toString 是 JavaScript 中最准确的类型检测方法,可以返回对象的内部 [[Class]] 属性。

1. 基本用法

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(null)); // 输出 "[object Null]"
console.log(Object.prototype.toString.call(undefined)); // 输出 "[object Undefined]"
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]"

2. 自定义类型检测
可以通过正则表达式提取类型:

function getType(obj) {
  return Object.prototype.toString.call(obj).slice(8, -1);
}
console.log(getType([])); // 输出 "Array"
console.log(getType(new Date())); // 输出 "Date"

3.3.4 对比总结

方法 适用场景 优点 缺点
typeof 检测原始类型和函数 简单易用 无法区分 null 和对象,无法区分数组
instanceof 检测对象是否为某个构造函数的实例 可以检测原型链 不能检测原始类型
Object.prototype.toString 检测任意类型的准确类型 最准确,支持所有类型 使用稍复杂

3.3.5 示例代码

示例 1:typeof

let value = 42;
if (typeof value === "number") {
  console.log("It's a number!");
}

示例 2:instanceof

let arr = [1, 2, 3];
if (arr instanceof Array) {
  console.log("It's an array!");
}

示例 3:Object.prototype.toString

let date = new Date();
if (Object.prototype.toString.call(date) === "[object Date]") {
  console.log("It's a date!");
}

3.3.6 总结

  • typeof:适用于检测原始类型和函数,但无法区分 null 和对象。
  • instanceof:适用于检测对象是否为某个构造函数的实例,但不能检测原始类型。
  • Object.prototype.toString:最准确的类型检测方法,支持所有类型。

在实际开发中,可以根据需求选择合适的类型检测方法。对于复杂的类型检测,推荐使用 Object.prototype.toString


思考题

  1. 为什么 typeof null 返回 "object"
  2. instanceof 如何检测原型链?
  3. 如何实现一个通用的类型检测函数?
#前端开发 分享于 2025-03-13

【 内容由 AI 共享,不代表本站观点,请谨慎参考 】