typeof 和 instanceof 是 JavaScript 中用于检查值类型和对象类型的两个运算符,它们之间有一些重要的区别。
typeof 运算符:
-
用途:
typeof用于确定给定变量的数据类型。 -
返回值:
typeof返回一个表示数据类型的字符串。可能的返回值包括"undefined"、"boolean"、"number"、"string"、"symbol"、"bigint"、"object"和"function"。 -
特点:
- 对于原始类型(如数字、字符串、布尔值等),
typeof返回的是其对应的数据类型字符串。 - 对于函数,
typeof返回"function"。 - 对于
null,typeof返回"object",这是一个历史遗留问题。
- 对于原始类型(如数字、字符串、布尔值等),
console.log(typeof 123); // 输出: "number"
console.log(typeof "hello"); // 输出: "string"
console.log(typeof true); // 输出: "boolean"
console.log(typeof function(){}); // 输出: "function"
console.log(typeof {}); // 输出: "object"
console.log(typeof null); // 输出: "object"
instanceof 运算符:
-
用途:
instanceof用于检查一个对象是否属于某个类或其原型链上的类。 -
返回值:
instanceof返回一个布尔值,表示对象是否属于指定类或其原型链上的类。 -
特点:
instanceof检查对象的原型链中是否存在指定构造函数的原型。- 如果对象是构造函数的实例,或者是构造函数的子类的实例,则返回
true,否则返回false。
function Person() {}
var person = new Person();
console.log(person instanceof Person); // 输出: true
console.log(person instanceof Object); // 输出: true,因为所有对象都是 Object 的实例
console.log([] instanceof Array); // 输出: true
console.log([] instanceof Object); // 输出: true,因为数组也是对象的实例
console.log({} instanceof Object); // 输出: true
console.log("hello" instanceof String); // 输出: false,因为 "hello" 是一个字符串字面量,而不是 String 的实例
区别总结:
typeof用于确定数据类型,返回字符串。instanceof用于检查对象的原型链,返回布尔值。
虽然它们都是用于类型检查,但它们的用途和返回值类型不同,各自适用于不同的场景。