前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
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 运算符结果
JavaScript值与类型

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

typeof 只要遇到「不能被调用的对象」就返回 'object',普通对象、数组、Date、正则、Map、new String('a') 全在里面。最意外的是 typeof null 也是 'object',这是第一版引擎留下的 bug,所以判断对象时必须先排除 null。

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

`typeof` 只分三大类

  1. 原始值各自返回 'string'、'number'、'bigint' 等,唯独 null 例外
  2. 可调用对象普通函数、箭头函数、class 都返回 'function'
  3. 其他对象数组、Date、正则、Map、包装对象,统统是 'object'

typeof 的判断依据只有一个:这个对象能不能被调用。它根本不看对象是用什么构造函数创建的,所以从设计上就分不出数组和日期。

核心回答

先记住这个答案

typeof 只能返回 8 种字符串:'undefined'、'boolean'、'number'、'bigint'、'string'、'symbol'、'function'、'object'。对象这一侧它只看能不能被调用,能调用的返回 'function',其余一律返回 'object',所以普通对象、数组、Date、正则、Map、Set、new String('a') 这种包装对象全是 'object'。另外 typeof null 也返回 'object',这是早期实现留下的问题,因为兼容性一直没改。所以判断「是不是可用的对象」要写成 v !== null && typeof v === 'object',判数组用 Array.isArray。

  • 普通对象的 typeof 是 object
  • typeof null 历史上是 object
  • 数组用 Array.isArray 判断
  • 细分类型可用内置 toString

一张表看清哪些值是 'object'

把常见的值都跑一遍,旁边再用 Object.prototype.toString 打出它们真正的内部类型,对比就很清楚了。

typeof 和内部类型对照JavaScript
const values = [{}, [], new Date(0), /a/, new Map(), new String('a'), null, class {}, () => {}]
for (const v of values) {
  // 左边是 typeof 的结果,右边是真实的内部类型标签
  console.log(typeof v, Object.prototype.toString.call(v))
}
查看输出与解释
object [object Object]
object [object Array]
object [object Date]
object [object RegExp]
object [object Map]
object [object String]
object [object Null]
function [object Function]
function [object Function]

前七个 typeof 都是 'object',右边的标签却各不相同。class 也返回 'function',因为类本质上就是构造函数。new String('a') 是包装对象,和原始字符串 'a' 不一样,后者的 typeof 是 'string'。

typeof null 为什么是 'object'

第一版 JavaScript 引擎里,每个值在内存里由「类型标签 + 数据」组成,类型标签占低几位。对象的标签是 0,而 null 被表示成空指针,全部位都是 0,引擎一看标签是 0,就把它当成了对象。

后来 ES6 讨论阶段有人提议把它改成返回 'null',但当时大量线上代码写的是 typeof x === 'object' 并默认包含了 null 的情况,一改就会让这些代码的分支走错,所以提案被否掉了。结论就是:这个行为永远不会改,只能自己处理。

一次真实的线上报错
缓存模块约定没命中时返回 null。业务代码写了 if (typeof config === 'object') applyTheme(config.theme),本地一直有缓存没问题,新用户第一次访问时 config 是 null,判断照样通过,接着读 config.theme 就抛出 TypeError: Cannot read properties of null。修法是加上 config !== null,或者直接用可选链写成 config?.theme。

判断类型时该换什么工具

typeof 最适合判断原始类型和函数,比如 typeof cb === 'function'、typeof id === 'string',简单又快。一旦要区分对象的具体种类,就要换工具。

判断 null 直接用 v === null。判断数组用 Array.isArray(v),它能跨 iframe 正确识别,instanceof Array 做不到。要细分 Date、RegExp、Map 这些内置类型,用 Object.prototype.toString.call(v),它返回 '[object Date]' 这样的标签。不过这个标签可以被对象的 Symbol.toStringTag 改写,所以它适合做类型分发,不适合做安全校验。

回答前,多想一步

容易答错的地方

以为 typeof null 以后会被修好
修正提案已经被否决,规范里写死了 null 返回 'object'。任何拿到 'object' 就去读属性的代码,都要先排除 null。
以为 typeof [] 是 'array'
typeof 的返回值里根本没有 'array'。数组是不可调用的对象,所以只能是 'object'。
以为 typeof 永远不会报错
对未声明的变量用 typeof 是安全的,返回 'undefined'。但在 let、const、class 声明之前访问,变量处于暂时性死区,typeof 也会抛 ReferenceError。
试着用自己的话回答

面试官还会怎么问?

有没有返回 'undefined' 但其实是对象的值?

有,浏览器里的 document.all。它是个真实存在的对象,但为了兼容上古时代的浏览器检测代码,规范特意让它的 typeof 返回 'undefined',转布尔值也是 false。

怎么写一个判断「纯对象」的函数?

先排除 null 和非对象:v !== null && typeof v === 'object'。再看原型,Object.getPrototypeOf(v) 是 Object.prototype 或 null 才算纯对象。这样数组、Date、类实例都会被排除,Lodash 的 isPlainObject 就是这个思路。

typeof 和 instanceof 怎么选?

判断原始类型和函数用 typeof。判断对象是不是某个类的实例用 instanceof,它沿原型链查找。instanceof 不能用在原始值上,'a' instanceof String 是 false,而且不同 iframe 里的 Array 构造函数不是同一个,跨窗口判断会失效。

从一道题,走向一组知识

把知识连起来

值与类型

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

typeof 分不出的数组和日期,instanceof 可以沿原型链判断,但它跨 iframe 会失效。

值与类型

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

需要把 'object' 细分成 Array、Date、Null 时,用的就是 Object.prototype.toString。

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

参考资料

  • typeof

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

本题目录
  1. 先记住这个答案
  2. 一张表看清哪些值是 'object'
  3. typeof null 为什么是 'object'
  4. 判断类型时该换什么工具
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

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

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