typeof无法准确区分所有类型,需配合object.prototype.tostring.call()等方法;它对null、数组、日期、正则均返回"object",对函数返回"function",对symbol和bigint有专属返回值。

JavaScript中判断变量数据类型,typeof 是最常用的操作符,但它有局限性——对 null、数组、日期、正则等引用类型一律返回 "object",对函数返回 "function"(这是历史遗留问题),对 Symbol 返回 "symbol",对 BigInt 返回 "bigint"。所以单靠 typeof 无法准确区分所有类型,需配合其他方法。
typeof 的基本用法和常见陷阱
typeof 返回一个表示数据类型的字符串,注意它是个操作符,不是函数,括号非必需(但加括号更清晰)。常见返回值包括:"string"、"number"、"boolean"、"undefined"、"object"、"function"、"symbol"、"bigint"。
-
typeof null→"object"(这是 JS 最著名的 bug,至今未修复) -
typeof []、typeof new Date()、typeof /abc/→ 都是"object" -
typeof function(){}→"function"(虽属对象,但 typeof 特殊处理) -
typeof undefined和typeof undeclaredVar都返回"undefined"(不会报错)
准确识别引用类型:用 Object.prototype.toString.call()
这是最可靠的方式,能区分数组、日期、正则、Map、Set 等内置对象。原理是每个内置构造器的原型上都有独立的 toString 方法,通过 call 绑定目标值,返回形如 "[object Array]" 的字符串。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
-
Object.prototype.toString.call([])→"[object Array]" -
Object.prototype.toString.call(new Date())→"[object Date]" -
Object.prototype.toString.call(/a/g)→"[object RegExp]" -
Object.prototype.toString.call(null)→"[object Null]" -
Object.prototype.toString.call(undefined)→"[object Undefined]"
可封装为工具函数:
const getType = (val) => Object.prototype.toString.call(val).slice(8, -1).toLowerCase();<br>// getType([]) → "array"<br>// getType({}) → "object"
快速判断数组、日期、正则等:使用对应构造器的 instanceof 或更现代的 API
对特定类型,可用语义更清晰的方法:
- 数组:优先用
Array.isArray(arr)(比instanceof Array更可靠,尤其跨 iframe 场景) - 日期:
val instanceof Date && !isNaN(val)(避免无效 Date 对象) - 正则:
val instanceof RegExp或Object.prototype.toString.call(val) === "[object RegExp]" - Promise:
val && typeof val.then === 'function' && typeof val.catch === 'function',或更稳妥地用val.constructor === Promise(注意子类可能不匹配)
实际使用建议:按场景选择合适方式
日常开发中不必追求“绝对完美”的类型判断,应兼顾准确性、可读性和性能:
- 判断基础类型(string/number/boolean/undefined)且排除 null → 直接用
typeof x === "string" - 确认是否为 null → 显式用
x === null(不要依赖 typeof) - 区分普通对象和数组 → 用
Array.isArray(x)+typeof x === "object" && x !== null && !Array.isArray(x) - 需要统一识别所有内置类型(如序列化、调试、类型校验)→ 封装
Object.prototype.toString.call工具函数
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










