JavaScript 词条目录
前端Wiki/词条/typeof 与 instanceof

typeof 与 instanceof

定义两种最常用的类型判断手段:typeof 判断原始类型,instanceof 判断对象的具体类型

typeof 返回一个字符串,对 number、string、boolean、undefined、symbol、bigint 都准确,但有两个著名黑洞:typeof null === 'object'(历史遗留 bug),typeof 数组、对象、正则、日期统统返回 'object'。它的价值在于安全——对未声明变量调用 typeof 不报错,而直接访问会抛 ReferenceError。

instanceof 走原型链查找:a instanceof B 会沿 a 的原型链看是否有 B.prototype,因此能区分数组、Date、正则等引用类型。但它只适用于对象,原始值 instanceof 任何类型都是 false;并且跨 iframe / 跨窗口时原型不共享,判断会失效。日常推荐组合拳:原始类型用 typeof,引用类型用 instanceof 或 Object.prototype.toString.call。

JavaScript
console.log(typeof 42);        // number
console.log(typeof 'hi');      // string
console.log(typeof undefined); // undefined
console.log(typeof null);      // object(历史 bug)

const arr = [1, 2];
console.log(typeof arr);            // object
console.log(arr instanceof Array);  // true
console.log(arr instanceof Object); // true(原型链)

class Animal {}
class Dog extends Animal {}
const d = new Dog();
console.log(d instanceof Dog);    // true
console.log(d instanceof Animal); // true

// 原始值不能用 instanceof
console.log('abc' instanceof String); // false

// 最可靠的类型判断
function typeOf(x) {
  return Object.prototype.toString.call(x).slice(8, -1).toLowerCase();
}
console.log(typeOf([]));      // array
console.log(typeOf(null));    // null
console.log(typeOf(/a/));     // regexp
⚠ 常见误区
🔗 相关词条数据类型类型转换
← 返回来源章节数据类型