如何用 typeof 与 Array.isArray 准确识别基础类型与数组对象

大瑶同学_1881

大瑶同学_1881

2026-04-29

764人浏览

原创

typeof对基础类型基本可靠,但null返回"object",nan/infinity/数字字面量均返回"number";array.isarray是唯一靠谱的数组检测方式,es5标准,跨iframe安全且语义明确。

如何用 typeof 与 array.isarray 准确识别基础类型与数组对象

typeof 识别基础类型时的常见误判

typeof 对基础类型基本可靠,但有两个经典坑:null 返回 "object",而 NaN、Infinity、数字字面量(如 42)都返回 "number"——它不区分有效数与非数。

实际判断时别直接信 typeof x === "number" 就代表可计算;得配合 isFinite(x) 或 Number.isNaN(x) 二次确认。

另外,typeof new Number(42) 是 "object",而 typeof 42 是 "number",包装对象和原始值行为不一致,日常应避免用 new Number / new String。

Array.isArray 是唯一靠谱的数组检测方式

别用 typeof [] === "object"、instanceof Array 或 Object.prototype.toString.call([]) === "[object Array]" 来判断数组——前两者跨 iframe 失效,后者冗长且易写错字符串。

Array.isArray 是 ES5 标准方法,浏览器兼容到 IE9+,Node.js 全版本支持,语义明确、性能好、无环境陷阱。

常见误用场景:

  • 用 arr.constructor === Array:子类数组或自定义构造函数会失败
  • 依赖 arr.length !== undefined:类数组对象(如 arguments、NodeList)也满足
  • 检查 arr.push 是否存在:字符串也有 push(在某些错误挂载下)或根本没该方法但不报错

联合使用时的优先级与边界情况

想同时区分 null、基础类型、普通对象、数组?顺序很重要。先用 Array.isArray 单独抓数组,再用 typeof 分基础类型,最后用 x === null 或 Object.prototype.toString 补漏。

例如这个判断逻辑:

if (Array.isArray(x)) {
  return 'array';
} else if (x === null) {
  return 'null';
} else if (typeof x === 'object') {
  return 'plain object';
} else if (typeof x === 'string' || typeof x === 'number' || typeof x === 'boolean' || typeof x === 'undefined' || typeof x === 'symbol' || typeof x === 'bigint') {
  return typeof x;
}

注意:typeof 永远不会返回 "null",所以 null 必须显式比较;typeof 对函数返回 "function",但它本质是 object 的子类,是否归为“对象”取决于你的业务定义。

TypeScript 中 typeof 与 Array.isArray 的类型提示差异

TypeScript 的 typeof 操作符在类型层面只反映运行时基础类型(如 string、number),对数组它推导为 any[] 或具体泛型(如 string[]),但不会变成 Array<t></t> 类型名。

而 Array.isArray 在类型守卫中能触发类型收窄——加上 if (Array.isArray(x)) { ... } 后,TS 知道块内 x 是 unknown[] 或更精确的数组类型。

所以写类型守卫时优先用 Array.isArray,而不是靠 typeof x === "object" 再手动断言——后者无法触发自动收窄,容易漏掉 null 或其他对象。

容易被忽略的是:即使你写了 Array.isArray(x),如果 x 类型是 any 或 unknown,TS 仍允许后续任意属性访问;真正安全的前提是变量有初始类型约束,否则守卫只是运行时防护,不是编译期保障。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.31

2631

5

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

2025.10.31

514

9

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

2026.02.12

442

19

JavaScript中的typeof用法
JavaScript中的typeof用法

在JavaScript中,typeof是一个用来确定给定变量的数据类型的操作符。可以用来确定一个变量是字符串、数字、布尔值、函数、对象或undefined的数据类型。更多关于typeof用法相关文章,详情请看本专题下面的文章,php中文网欢迎大家前来学习。

2023.11.23

7427

13

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

80

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

80

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

80

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

60

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

60

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习