javascript类型识别需组合多种方法:原始类型用typeof(null需单独判断),对象类型用object.prototype.tostring.call,跨iframe环境依赖array.isarray和tostring,最终封装为返回小写类型名的typeof函数。

JavaScript类型识别不能只靠typeof或instanceof,必须组合多种方法才能覆盖所有情况——原始类型、内置对象、宿主对象、跨iframe环境、null、数组、日期、正则等都需要差异化处理。
区分原始类型与对象类型
原始类型(string/number/boolean/null/undefined/symbol/bigint)中,typeof对除null外的其他类型识别准确;但typeof null === 'object'是历史bug,需单独判断。对象类型(包括数组、日期、正则等)统一返回'object',无法区分,必须进一步检测。
- 用
typeof x === 'string' || typeof x === 'number' || ...逐个判断原始类型 -
x === null是识别null最直接安全的方式 -
typeof x === 'object' && x !== null可初步筛出非null对象
精准识别内置引用类型
对Array、Date、RegExp、Map、Set等,推荐使用Object.prototype.toString.call(x),它返回形如[object Array]的标准字符串,稳定且不受原型污染影响。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
Array.isArray(x)是识别数组的首选(ES5+),比toString更语义化 -
isDate(x)可封装为Object.prototype.toString.call(x) === '[object Date]' -
isRegExp(x)同理,避免依赖x.constructor === RegExp(易被篡改)
处理跨iframe和自定义类实例
在多iframe环境中,instanceof会失效(因构造函数不共享),而toString仍有效;对于自定义类,若需保留类型语义,建议配合Symbol.toStringTag或显式type属性。
- 跨iframe检测数组:仍可用
Array.isArray(规范保证其跨realm一致性) - 检测Promise:用
toString或检查typeof x.then === 'function'(注意不是所有thenable都是Promise) - 自定义类可设置
obj[Symbol.toStringTag] = 'MyClass',使toString.call(obj)返回预期结果
封装一个健壮的typeOf工具函数
综合以上策略,可实现一个返回标准小写类型名的函数,例如typeOf([]) → 'array'、typeOf(null) → 'null'、typeOf(new Date()) → 'date'。
- 优先处理原始类型和
null - 对对象调用
toString.call并提取第二词(如'Array'→'array') - 特殊处理
Function(typeof已准确)和AsyncFunction(需toString辅助) - 可选支持
isPlainObject逻辑(通过Object.getPrototypeOf(obj) === Object.prototype判断)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










