typeof 是 JavaScript 中轻量直接的类型检查工具,适合函数开头快速验证基础类型参数,但无法准确识别数组、正则、日期等引用类型,需结合 Array.isArray()、Object.prototype.toString.call() 等方式补足短板。

typeof 是 JavaScript 中最轻量、最直接的类型检查工具,适合在函数开头快速验证参数是否为预期类型(尤其是区分函数、字符串、数字、对象等基本类别),但它有局限性——比如无法准确识别数组、正则、日期等引用类型。排查函数参数类型错误时,关键是用对时机、补足短板。
一、用 typeof 检查基础类型参数是否符合预期
对 string、number、boolean、undefined、function、symbol 这几类,typeof 返回稳定且唯一的字符串(如 "string"、"function"),非常适合做第一道防线。
例如,一个只接受回调函数的工具函数:
function runIfFn(callback) {
if (typeof callback !== 'function') {
throw new TypeError('Expected a function, but got ' + typeof callback);
}
return callback();
}
这样调用 runIfFn(42) 或 runIfFn(null) 就会立刻报错,提示明确,便于调试。
二、注意 typeof 对 null 和对象的“误判”
typeof null === 'object' 是 JS 的历史遗留 bug,不能用来判断是否为真正的对象;同样,数组、正则、日期等也都会返回 "object"。所以不能单靠 typeof 判断“是不是对象”。
若函数要求参数是普通对象(非 null、非数组、非 Date 等),建议组合使用:
- 先用
typeof arg === 'object'排除非对象类型(如 string、function) - 再用
arg !== null && !Array.isArray(arg)剔除 null 和数组 - 必要时用
Object.prototype.toString.call(arg) === '[object Object]'精确匹配
三、避免用 typeof 检查 undefined 或未传参场景
当参数可能未传(即 undefined)时,typeof 是安全的——它不会报错,而直接访问 arg.xxx 可能触发 Cannot read property of undefined。
例如:
function greet(name) {
if (typeof name !== 'string') {
name = 'Guest'; // 默认值兜底
}
return `Hello, ${name}`;
}
这样 greet()、greet(null)、greet(123) 都不会崩溃,而是优雅降级。
四、与其它检测方式配合使用更可靠
typeof 不是万能的,实际排查中常需搭配:
-
Array.isArray()判断数组(typeof [] === 'object' 失效) -
value instanceof Date或Object.prototype.toString.call(value) === '[object Date]'判断日期 -
Number.isNaN()替代typeof NaN === 'number'的误导 - 对对象属性进一步校验时,用
hasOwnProperty或可选链?.防止深层访问出错
不复杂但容易忽略:把 typeof 当作参数校验的第一步,不是终点。它快、安全、语义清晰,但必须清楚它的边界在哪里。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











