typeof 与 instanceof 区别

99 阅读2分钟

typeofinstanceof 是 JavaScript 中用于检查值类型和对象类型的两个运算符,它们之间有一些重要的区别。

typeof 运算符:

  1. 用途: typeof 用于确定给定变量的数据类型。

  2. 返回值: typeof 返回一个表示数据类型的字符串。可能的返回值包括 "undefined""boolean""number""string""symbol""bigint""object""function"

  3. 特点:

    • 对于原始类型(如数字、字符串、布尔值等),typeof 返回的是其对应的数据类型字符串。
    • 对于函数,typeof 返回 "function"
    • 对于 nulltypeof 返回 "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 运算符:

  1. 用途: instanceof 用于检查一个对象是否属于某个类或其原型链上的类。

  2. 返回值: instanceof 返回一个布尔值,表示对象是否属于指定类或其原型链上的类。

  3. 特点:

    • 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 用于检查对象的原型链,返回布尔值。

虽然它们都是用于类型检查,但它们的用途和返回值类型不同,各自适用于不同的场景。