前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
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 热点
旧版
首页程序员面试题库Array.isArray typeof 数组检测
JavaScript值与类型

typeof [] 为什么是 'object'?怎么准确判断一个值是数组?

typeof 只能分出原始类型和函数,所有非函数的对象都返回 'object',数组也是对象,所以 typeof [] 是 'object'。判断数组用 Array.isArray(value),它准确,而且跨 iframe 也不会出错。

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

三种判断数组的方式

  1. Array.isArray检查的是对象内部是否为数组,不看原型链
  2. instanceof Array看原型链上有没有当前窗口的 Array.prototype
  3. Object.prototype.toString返回 [object Array],老代码里常用的兼容写法

Array.isArray 对 Proxy 包裹的数组也返回 true,而改了原型的普通对象骗不过它。

核心回答

先记住这个答案

typeof 的设计很粗:它只区分几种原始类型(string、number、boolean、undefined、symbol、bigint)和函数,剩下所有对象一律返回 'object'。数组在 JavaScript 里就是一种特殊的对象,所以 typeof [] 是 'object'。准确判断数组用 Array.isArray(value),这是 ES5 专门为这个问题加的方法。

  • typeof 对数组返回 object
  • 判断数组首选 Array.isArray
  • 跨 iframe 用 Array.isArray 判数组
  • Symbol.toStringTag 可伪造类型标签

typeof 为什么分不出数组

typeof 看的是值属于哪一大类。数组、普通对象、日期、正则、null 都在「对象」这一类里(null 是历史 bug),所以它们的 typeof 都一样。

用不同方法检测同一组值JavaScript
const values = [[], {}, null, new Date(), { length: 0 }]

for (const v of values) {
  console.log(typeof v, Array.isArray(v), Object.prototype.toString.call(v))
}

const fake = Object.setPrototypeOf({}, Array.prototype) // 原型改成数组的原型
console.log(fake instanceof Array, Array.isArray(fake))
查看输出与解释
object true [object Array]
object false [object Object]
object false [object Null]
object false [object Date]
object false [object Object]
true false

前五行 typeof 全是 object,没有区分度。{ length: 0 } 这种类数组对象,Array.isArray 也不会误判。最后一行最能说明差别:把普通对象的原型改成 Array.prototype,instanceof 就被骗了,Array.isArray 不受影响,因为它检查的是对象本身是不是真正的数组,而不是原型链。

iframe 场景下 instanceof 为什么失效

每个 iframe 都有自己独立的一套全局对象,包括自己的 Array 构造函数和 Array.prototype。父页面拿到子 iframe 里创建的数组,它的原型链指向的是子 iframe 的 Array.prototype,和父页面的 Array 不是同一个对象。所以在父页面里写 arr instanceof Array 会得到 false,但它明明就是数组。

Array.isArray 没有这个问题,它不依赖原型链。postMessage 传过来的数据会被结构化克隆,重新在当前窗口创建,反而不受影响,真正会踩坑的是直接访问 iframe.contentWindow 里的对象。

回答前,多想一步

容易答错的地方

用 arr.constructor === Array 判断
constructor 只是原型上的一个普通属性,谁都能改,跨 iframe 也会失效。对象如果是 Object.create(null) 创建的,访问 constructor 直接得到 undefined。
以为 Object.prototype.toString 绝对可靠
ES2015 以后,对象可以通过 Symbol.toStringTag 自定义这个结果,比如给普通对象设 [Symbol.toStringTag]: 'Array',就会输出 [object Array]。它仍然适合区分内置类型,但判断数组还是 Array.isArray 更准。
以为有 length 就是数组
arguments、NodeList、字符串都有 length,它们是类数组,不能直接调 map、filter。需要数组方法时用 Array.from 转一下。
试着用自己的话回答

面试官还会怎么问?

typeof null 为什么也是 'object'?

这是第一版 JavaScript 留下的 bug。当时值的底层用类型标签加数据存储,对象的标签是 0,而 null 用全零表示,于是也被当成了对象。为了不破坏已有网页,这个行为一直没改。判断 null 直接用 value === null。

怎么判断一个值是普通对象?

常见写法是 Object.prototype.toString.call(v) === '[object Object]',再加上原型判断:Object.getPrototypeOf(v) 是 Object.prototype 或 null。lodash 的 isPlainObject 就是这个思路。

TypeScript 里 Array.isArray 能收窄类型吗?

能。它的类型声明是类型守卫,if (Array.isArray(v)) 之后,分支里的 v 会被收窄成数组类型。不过对于 readonly 数组的联合类型,收窄结果有时不够精确,需要自己写类型守卫补一下。

从一道题,走向一组知识

把知识连起来

值与类型

BigInt 和 Number 能混着算吗?BigInt 在运算和类型转换上有哪些限制?

typeof 分不出数组,而 BigInt 反过来是 typeof 能直接认出来的新原始类型,返回 'bigint'。

值与类型

10n 和 BigInt(10) 有什么区别?创建 BigInt 时怎么避免精度已经丢了?

判断类型时 typeof 10n 返回 'bigint',这是 BigInt 语法题里常被顺带问到的一点。

参考资料

  • JavaScript:值与类型参考资料

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

本题目录
  1. 先记住这个答案
  2. typeof 为什么分不出数组
  3. iframe 场景下 instanceof 为什么失效
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

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

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