最可靠的方式是使用 object.prototype.tostring.call(),它能准确区分内置对象类型,比 typeof 和 constructor 更严谨;封装时需处理 null、提取类型名并转小写,还可扩展类型断言与多类型判断功能。

JavaScript 中获取变量的真实类型,最可靠的方式是使用 Object.prototype.toString.call(),它能准确区分内置对象类型(如 Date、RegExp、Map、Set 等),比 typeof 和 constructor 更严谨。封装时应兼顾简洁性、可读性和扩展性。
基础封装:返回标准类型字符串
核心逻辑是统一调用 toString 并提取中括号内的类型名:
- 用
Object.prototype.toString.call(val)获取形如"[object Array]"的字符串 - 用正则或
slice提取类型关键词,转为小写便于比较 - 对
null单独处理(因为toString.call(null)返回"[object Null]")
示例实现:
function typeOf(val) {
if (val === null) return 'null';
const str = Object.prototype.toString.call(val);
return str.slice(8, -1).toLowerCase();
}
调用结果:typeOf([1,2]) → 'array',typeOf(/a/g) → 'regexp',typeOf(new Date()) → 'date'。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
增强封装:支持类型断言与多类型判断
实际开发中常需判断是否为某类(如 isArray),可基于基础函数扩展出工具集:
- 导出一个主函数
typeOf,同时挂载常用判断方法(如typeOf.array(val)) - 每个判断方法内部仍走
toString.call,避免依赖typeOf(val) === 'xxx'字符串比较(更健壮) - 支持传入多个类型名进行“或”判断,例如
typeOf.oneOf(val, 'array', 'object')
这样既保持单点入口,又提升实用性。
注意边界与兼容性
某些环境或自定义类可能影响结果:
- ES6+ 的
Symbol.toStringTag可被修改,导致toString.call返回非预期值(属主动干预,一般无需处理) - 跨 iframe 的对象(如
iframe.contentWindow.Array)在部分旧浏览器中可能识别异常,现代浏览器已基本修复 - 不推荐用
val.constructor.name替代——它不可靠(易被重写,且原始类型无constructor)
轻量第三方参考:lodash 的 _.isXxx 系列
如果项目已引入 lodash,可直接使用 _.isArray、_.isDate 等——它们底层正是基于 toString.call 封装,经过大量场景验证。自行封装适合轻量项目或学习理解原理。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










