讲师中心 微信公众号
AI工具推荐 视频效率加速

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

大瑶同学_1881

大瑶同学_1881

发布时间:2026-04-29 21:52:19

|

764人浏览过

|

来源于php中文网

原创

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> 类型名。

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

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

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

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

热门AI工具

更多
PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

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

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

2651

2023.10.31

php数据类型
php数据类型

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

514

2025.10.31

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

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

442

2026.02.12

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

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

7467

2023.11.23

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

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

120

2026.09.30

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

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

100

2026.09.30

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

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

80

2026.09.30

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

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

60

2026.09.30

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

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

80

2026.09.29

热门下载

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

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn