JavaScript 中 typeof 和 instanceof 的类型检查差异

typeof 和 instanceof 是 JavaScript 中用于类型检查的两个操作符,但它们的工作方式和适用场景有所不同。
1. typeof
typeof 是一个一元操作符,用于返回一个表示操作数类型的字符串。它主要用于检查基本数据类型(如 number、string、boolean 等)以及 function 和 undefined。
返回值:
"undefined":如果操作数未定义。"boolean":如果操作数是布尔值。"number":如果操作数是数字(包括NaN和Infinity)。"string":如果操作数是字符串。"symbol":如果操作数是 Symbol 类型。"function":如果操作数是函数。"object":如果操作数是对象(包括null、数组、对象等)。
示例:
typeof 42; // "number"
typeof "hello"; // "string"
typeof true; // "boolean"
typeof undefined; // "undefined"
typeof null; // "object" (这是一个历史遗留问题)
typeof function() {}; // "function"
typeof {}; // "object"
typeof []; // "object"
注意:
typeof null返回"object",这是一个历史遗留问题,因为 JavaScript 最初的设计中,null被错误地标记为对象类型。typeof无法区分数组和普通对象,因为它们都返回"object"。
2. instanceof
instanceof 是一个二元操作符,用于检查一个对象是否是某个构造函数的实例。它主要用于检查对象的继承关系。
语法:
object instanceof constructor
返回值:
true:如果object是constructor的实例。false:如果object不是constructor的实例。
示例:
const arr = [];
arr instanceof Array; // true
arr instanceof Object; // true (因为 Array 继承自 Object)
const date = new Date();
date instanceof Date; // true
date instanceof Object; // true (因为 Date 继承自 Object)
function Person() {}
const person = new Person();
person instanceof Person; // true
person instanceof Object; // true (因为 Person 继承自 Object)
注意:
instanceof只能用于对象,不能用于基本数据类型(如number、string、boolean等)。instanceof会沿着原型链向上查找,因此如果对象是某个类的实例或其子类的实例,instanceof都会返回true。
总结:
typeof用于检查基本数据类型和函数,返回一个表示类型的字符串。instanceof用于检查对象是否是某个构造函数的实例,返回一个布尔值。
在实际开发中,typeof 通常用于检查基本数据类型和函数,而 instanceof 用于检查对象的继承关系。两者结合使用可以更全面地处理类型检查的需求。