前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库typeof instanceof 类型检查
JavaScript值与类型

typeof 和 instanceof 分别在什么场景下用?各有什么坑?

typeof 返回一个字符串,能区分 number、string、boolean、undefined、function 等原始类型,但对 null 返回 "object"。instanceof 沿原型链查找,能判断对象是不是某个构造函数的实例,但对原始值不起作用。

前端进阶之旅 · 一题精讲更新于 2026.09.29
JavaScript#值与类型
先看核心答案读代码示例
理解线索

两种类型检查的适用范围

  1. typeof返回类型字符串,适合原始值,所有对象都返回 "object"
  2. instanceof查原型链,适合对象,对原始值无效
  3. Object.prototype.toString返回 "[object Type]" 格式,最通用的类型判断方式

typeof function(){} 返回 "function" 是个特例,函数也是对象,但 typeof 给了它单独的标识。

核心回答

先记住这个答案

typeof 用在原始类型上很好用,一个运算符就能区分 number、string、boolean、undefined、symbol、bigint 和 function。但它有两个盲区:typeof null 返回 "object",所有普通对象(数组、日期、正则)也都返回 "object"。instanceof 弥补了后一个问题,它沿原型链往上找,能判断一个对象是不是某个构造函数的实例。但 instanceof 对原始值不起作用,"hello" instanceof String 是 false。

  • typeof null 误报为 object
  • typeof 区分不了数组、日期等对象类型
  • instanceof 对原始值返回 false
  • 跨 iframe 判数组用 Array.isArray

typeof 的返回值和盲区

typeof 对所有原始类型都能给出准确的类型字符串,唯一的例外是 null——这是 JavaScript 第一版实现时遗留的 bug。对象方面,只有函数会返回 "function",其他对象一律返回 "object",没法进一步区分。

各种值的 typeof 结果JavaScript
console.log(typeof 42);
console.log(typeof 'hello');
console.log(typeof true);
console.log(typeof undefined);
console.log(typeof null);
console.log(typeof [1, 2, 3]);
console.log(typeof { a: 1 });
console.log(typeof function(){});
查看输出与解释
number
string
boolean
undefined
object
object
object
function

数组和普通对象的 typeof 结果一样,都是 "object"。如果你想知道一个值是不是数组,typeof 帮不了你。typeof null 返回 "object" 更是经典面试题,这不代表 null 是对象,只是历史实现的 bug 一直没修。 typeof 还有一个特殊能力:对未声明的变量不会报错,而是返回 "undefined"。这在检查全局变量是否存在时偶尔有用,比如 typeof jQuery !== "undefined"。

instanceof 怎么沿原型链查找

instanceof 的判断逻辑是:拿右侧构造函数的 prototype 属性,在左侧对象的原型链上往上找,找到就返回 true。所以 [] instanceof Array 是 true,因为数组实例的原型链上有 Array.prototype。同样 [] instanceof Object 也是 true,因为原型链最终会到 Object.prototype。

instanceof 对原始值和对象的不同表现JavaScript
console.log([] instanceof Array);
console.log([] instanceof Object);
console.log('hello' instanceof String);
console.log(42 instanceof Number);
console.log(new Error('oops') instanceof Error);
console.log(/abc/ instanceof RegExp);
查看输出与解释
true
true
false
false
true
true

"hello" instanceof String 是 false,因为字符串字面量是原始值,不是 String 构造函数创建的对象实例,它的原型链上没有 String.prototype。只有 new String("hello") 才会返回 true,但实际项目中几乎没人用 new String。 这也是 instanceof 最大的局限:它只能用在对象上,对原始值一概返回 false。另一个问题是跨 iframe 场景——每个 iframe 有自己的全局环境和构造函数,父页面的 Array 和子 iframe 的 Array 不是同一个,所以跨 iframe 传过来的数组 instanceof Array 会返回 false。这就是 Array.isArray() 存在的原因,它不依赖原型链,跨 iframe 也能正确判断。

回答前,多想一步

容易答错的地方

用 typeof 判断数组
typeof [] 返回 "object",和普通对象没有区别。判断数组应该用 Array.isArray(),它在任何环境下都可靠,包括跨 iframe。
认为 instanceof 的结果不会变
instanceof 查的是当前的原型链。如果用 Object.setPrototypeOf() 修改了对象的原型,或者手动改了构造函数的 prototype 属性,instanceof 的结果就会跟着变。它反映的是运行时的原型关系,不是创建时的。
试着用自己的话回答

面试官还会怎么问?

有没有一种方法能可靠判断任意值的类型?

Object.prototype.toString.call(value) 返回 "[object Type]" 格式的字符串,对 null 返回 "[object Null]",对数组返回 "[object Array]",对日期返回 "[object Date]"。它不依赖原型链,是最通用的类型判断方式。

Symbol.hasInstance 是做什么的?

它可以自定义 instanceof 的行为。在类上定义 static [Symbol.hasInstance](value) 方法后,value instanceof MyClass 会调用这个方法而不是走默认的原型链查找。不过实际项目中很少用到。

typeof 对 let 声明的变量在暂时性死区里会怎样?

会抛 ReferenceError。typeof 对未声明的变量不报错,但对 let 和 const 声明的、还没到声明语句的变量会报错。这是暂时性死区的规则,typeof 也绕不过去。

从一道题,走向一组知识

把知识连起来

值与类型

怎么用 Object.prototype.toString 做比 typeof 更精确的类型判断?

typeof 和 instanceof 都有盲区时,Object.prototype.toString.call() 是最可靠的兜底方案。

值与类型

JS 的 Number 能精确表示的整数范围是多少?超过了会怎样?

typeof 42n 返回 "bigint",这是 ES2020 新增的类型字符串,和 "number" 是不同的。

值与类型

typeof 什么时候会返回 'object'?typeof null 为什么也是 'object'?

typeof 一共能返回哪些字符串、每种对应什么情况,那道题有完整列表。

放回知识体系中复习JavaScript 进阶知识

参考资料

  • instanceof

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. typeof 的返回值和盲区
  3. instanceof 怎么沿原型链查找
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑