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

在类型检查中,typeof 与 instanceof 各自的适用场景和缺陷是什么?

typeof 适合判断原始类型,instanceof 适合检查自定义对象继承链;但两者各有盲区,需配合其他方法弥补。

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

一句区分:typeof 看值类型,instanceof 看原型链

  1. typeof 结果返回 8 种固定字符串,如 'number' 'object'
  2. instanceof 结果检查右侧 prototype 是否出现于原型链
  3. 跨 realm 盲区不同全局对象导致 prototype 不同,检查失败

instanceof 不保证对象由该构造器创建,原链可被改写。

核心回答

先记住这个答案

typeof 对原始类型(除 null)返回正确类型,但对对象统一返回 'object',无法区分数组、函数等,且 null 返回 'object' 是历史 bug。instanceof 检查构造函数的 prototype 是否在对象原型链上,适用于对象,但对原始类型返回 false,对跨 realm 对象会失效,且可被修改原型链或 Symbol.hasInstance 干扰。

  • typeof 适合基本类型除 null
  • instanceof 只查对象原型链
  • 跨 realm 用 Array.isArray 等

typeof 和 instanceof 各自的底层机制

typeof 是运算符,在 JS 引擎内部根据值的内部类型返回固定字符串。对原始类型返回准确类型,如 typeof 42 === 'number'、typeof 'x' === 'string'、typeof true === 'boolean'、typeof undefined === 'undefined'、typeof Symbol() === 'symbol'、typeof 10n === 'bigint'。但 null 返回 'object',这是早期实现遗留的 bug,因 null 的二进制标记全零被识别为对象。对于所有对象(函数除外)统一返回 'object',函数返回 'function'。因此 typeof 无法区分数组、日期、正则等。

instanceof 是检查右侧函数的 prototype 属性是否出现在左侧对象的原型链中,返回布尔值。它要求左侧必须是对象,原始类型直接返回 false,如 'abc' instanceof String 为 false。它基于原型链查找,所以可以判断继承关系。instanceof 的行为可通过 Symbol.hasInstance 自定义。它依赖构造函数的 prototype 属性,如果构造函数 prototype 被重新赋值,会影响结果。

一个跨 realm 场景:跨 iframe 类型判断

一个页面中通过 iframe 嵌入子应用,主脚本拿到一个 iframe.contentWindow 中的数组,如 const arr = iframe.contentWindow.array。此时 typeof arr === 'object',不能判断是数组。执行 arr instanceof iframe.contentWindow.Array 会返回 true,但只能用该 realm 的 Array;如果用主 realm 的 Array 判断则返回 false,因为不同的 iframe 拥有独立的全局环境,Array.prototype 不是同一个。

处理:若判断这个值是不是数组,最好的方法是直接用 Array.isArray(arr),它内部不依赖原型链,能正确识别跨 realm 的数组。类似地,判断普通对象跨 realm 可用 Object.prototype.toString.call(arr) 返回 '[object Array]'。这些方法避免手动比对构造器。

instanceof 失效的条件与替代

instanceof 依赖构造函数的 prototype 属性。若构造函数 prototype 被重新赋值,已存在的实例可能不再被视为它的实例,例如 function C(){} const o = new C(); C.prototype = {}; o instanceof C 变为 false。同理,修改对象的 proto 或使用 Object.create 改变原型也会改变结果。

包装对象场景下,new String('x') instanceof String 为 true,但 'x' instanceof String 为 false,因为原始值没有原型链可查。typeof new String('x') 返回 'object'。所以判断原始字符串应使用 typeof,判断包装对象可使用 instanceof 或检查 constructor。在类继承中,instanceof 能反映原型链,但不保证实例具有类的私有字段,故不能完全依赖它做品牌校验。

回答前,多想一步

容易答错的地方

typeof 判断对象类型可靠
误以为 typeof 能区分数组、日期等。实际上 typeof [] 返回 'object',与普通对象无异。要区分应使用 Array.isArray 或 Object.prototype.toString。
instanceof 不存在跨 realm 问题
忽视跨 realm 场景。当对象来自不同 iframe、window 或 worker 时,其原型与当前全局构造函数不同,instanceof 判断会失败。应使用能跨 realm 的 API 如 Array.isArray。
试着用自己的话回答

面试官还会怎么问?

typeof null 为何返回 'object'?现在能修复吗?

这是历史遗留,源自 JS 第一版中 null 的类型标签是 0,与对象相同。修复会造成大量现有代码崩坏,所以保留。可改用 obj === null 来判断。

Symbol.hasInstance 如何影响 instanceof?

构造器可定义静态方法 Symbol.hasInstance,该方法会在 instanceof 时被优先调用,返回布尔值覆盖默认原型链检查。常用于自定义品牌检查或模拟类型判断。

判断一个值是否是函数,typeof 和 instanceof 哪个好?

typeof 更稳妥,因为 typeof fn === 'function' 对普通函数和 class 都成立;instanceof 需与特定构造器比较且跨 realm 失效。若需判断是否为可调用对象,typeof 足够。

从一道题,走向一组知识

把知识连起来

值与类型

如何利用 Object.prototype.toString 实现比 typeof 更精确的内置类型判断?

同属「值与类型」专题,接着看 Object.prototype.toString 类型判断 在具体场景中的处理方式。

值与类型

JavaScript 的 Number 类型能精确表示的整数范围是多少?超过后会发生什么?

同属「值与类型」专题,接着看 JavaScript 安全整数范围 在具体场景中的处理方式。

值与类型

typeof 运算符对哪些值可能返回 'object',又有哪些意外之处值得注意?

同属「值与类型」专题,接着看 typeof 运算符结果 在具体场景中的处理方式。

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

参考资料

  • instanceof

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

本题目录
  1. 先记住这个答案
  2. typeof 和 instanceof 各自的底层机制
  3. 一个跨 realm 场景:跨 iframe 类型判断
  4. instanceof 失效的条件与替代
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

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

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