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
用于检查对象的继承关系。两者结合使用可以更全面地处理类型检查的需求。