typeof 与 instanceof 有什么区别

typeof 与 instanceof 有什么区别

编码文章call10242025-07-28 13:56:375A+A-

typeof 和 instanceof 是 JavaScript 中用于类型检查的两个操作符,但它们的用途和适用场景有显著区别。以下是它们的区别及使用注意事项:

1.typeof

  • 作用:返回一个变量的基本类型(以字符串形式)。
  • 返回值
    • 基本类型:"number"、"string"、"boolean"、"undefined"、"symbol"、"bigint"。
    • 特殊值:null 返回 "object"(历史遗留问题)。
    • 函数:"function"。
    • 对象和数组:"object"。
  • 示例
typeof 42;           // "number"
typeof "hello";      // "string"
typeof true;         // "boolean"
typeof undefined;    // "undefined"
typeof null;         // "object"(需特别注意!)
typeof {};           // "object"
typeof [];           // "object"
typeof function(){}; // "function"

注意事项:

  1. typeof null === "object"
    这是一个已知的 JavaScript 设计缺陷,判断 null 需直接使用 === null。
  2. 无法区分对象的具体类型
    如数组、普通对象、日期对象等,typeof 均返回 "object"。
  3. 安全检测未声明变量
    typeof 对未声明的变量返回 "undefined",而其他操作可能导致错误:
typeof undeclaredVar; // "undefined"
undeclaredVar instanceof Object; // 抛出 ReferenceError

2.instanceof

  • 作用:检测构造函数的 prototype 是否在对象的原型链上(判断对象是否是某个类的实例)。
  • 示例
[] instanceof Array;          // true
{} instanceof Object;          // true
new Date() instanceof Date;    // true
function Person() {}
const p = new Person();
p instanceof Person;          // true

注意事项:

  1. 不适用于基本类型
    instanceof 仅对对象有效。原始值(如 "hello")会被判定为 false,而包装对象(如 new String("hello"))为 true:
"hello" instanceof String;   // false
new String("hello") instanceof String; // true
  1. 特殊对象可能失效
    如通过 Object.create(null) 创建的无原型对象,instanceof Object 返回 false。

关键区别

特性

typeof

instanceof

适用类型

基本类型、函数

对象

返回值

类型字符串(如 "string")

布尔值(是否匹配构造函数)

检测原型链

特殊值处理

null 返回 "object"

原始值返回 false

实际使用建议

  1. 基本类型检测
    使用 typeof,但注意 null 需用 === null。


if (typeof variable === "string") { /* ... */ }
if (variable === null) { /* ... */ }

对象类型检测

  • 数组:优先用 Array.isArray()。
  • 内置对象(如 Date、RegExp):结合 Object.prototype.toString:
Object.prototype.toString.call(date) === "[object Date]";
  1. 自定义对象
    使用 instanceof,但确保原型链未被破坏。
  2. 跨环境对象
    避免依赖 instanceof,改用鸭子类型或 Symbol.toStringTag。

总结

  • typeof:快速判断基本类型和函数,注意 null 的陷阱。
  • instanceof:检测对象是否为某个类的实例,注意跨环境和原型修改问题。
  • 结合其他方法(如 Array.isArray() 或 Object.prototype.toString)可提高类型检查的可靠性。
点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4