JavaScript类型判断需组合使用typeof、instanceof和Object.prototype.toString.call():typeof适合基本类型但null误判为object;instanceof可区分引用类型实例但不适用于基本类型和null/undefined;toString.call最精准,能识别所有内置类型。

JavaScript 中判断基本数据类型和引用类型,不能只靠一种方法,因为每种检测手段都有明确的适用边界。关键不是记住结论,而是理解“为什么这个方法在这里失效”,才能在真实开发中快速定位问题。
用 typeof 判断基本类型最直接
typeof 对 7 种基本类型(string、number、boolean、undefined、symbol、bigint、null)返回对应字符串,但有两个经典例外:
- null 返回 "object" —— 这是历史遗留 bug,不是设计意图
- 所有引用类型(Array、Date、RegExp、Map 等)除了 function 都返回 "object"
- function 返回 "function",但它仍是 object 的子类型,不是独立数据类型
所以 typeof 适合快速筛出 string/number/boolean/undefined/symbol/bigint,但遇到 "object" 就得继续深挖。
用 instanceof 区分常见引用类型
instanceof 用于检测一个值是否是某个构造函数的实例,适合判断 Array、Date、RegExp、自定义类等:
- [] instanceof Array → true
- new Date() instanceof Date → true
- /abc/ instanceof RegExp → true
- 1 instanceof Number → false(基本类型不适用)
- null 和 undefined 无法用 instanceof 检测(会报错或恒为 false)
注意:它依赖原型链,如果对象被篡改过 prototype 或跨 iframe 创建,结果可能不可靠。
用 Object.prototype.toString.call() 做统一精准识别
这是目前最可靠、覆盖最全的类型检测方式,能区分所有内置类型,包括 null 和 undefined:
- Object.prototype.toString.call(1) → "[object Number]"
- Object.prototype.toString.call([]) → "[object Array]"
- Object.prototype.toString.call(null) → "[object Null]"
- Object.prototype.toString.call(undefined) → "[object Undefined]"
- Object.prototype.toString.call(new Set()) → "[object Set]"
原理是每个内置对象都定义了自己的 @@toStringTag,该方法读取这个内部属性生成标准字符串。建议封装成工具函数复用。
实际判断流程建议
日常编码中可按顺序判断:
- 先用 typeof 快速识别基本类型(排除 "object" 和 "function")
- 遇到 "function",可直接认定为引用类型中的函数
- 遇到 "object",再用 Object.prototype.toString.call() 精准识别具体类型
- 需要兼容老环境且只关注数组时,可用 Array.isArray() —— 它比 instanceof 更安全
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











