JavaScript类型判断本身不抛异常,但类型误用操作(如null.method()、JSON.parse非法输入)会触发TypeError等运行时异常;应优先用typeof、可选链等主动防护,而非依赖try...catch兜底。

JavaScript 中的类型判断本身不会抛出异常,但基于类型的操作(比如调用方法、访问属性、解析数据)容易因类型不匹配而触发运行时异常。真正的异常处理机制不是用来“判断类型”,而是用来兜住因类型误用导致的错误,比如 TypeError、ReferenceError 等。
常见由类型误用引发的异常
这些错误在执行时才会暴露,无法靠编译检查提前发现:
-
TypeError:最典型,例如
null.method()、5.toUpperCase()、undefined.x、或对非函数值使用()调用 -
ReferenceError:访问未声明变量,如
console.log(foo)(foo 从未定义) -
SyntaxError:严格来说不属于“运行时类型问题”,但常因类型混淆写错语法,如
let x = ;或对象字面量缺逗号 -
RangeError:如
new Array(-1)或递归过深,虽非直接类型错误,但常与类型校验缺失有关
用 try...catch 捕获类型相关异常
只对同步代码有效,适用于已知可能因类型不确定而出错的操作:
- 解析 JSON 字符串:
JSON.parse(input)—— 输入非法会抛SyntaxError - 正则构造:
new RegExp(pattern)—— 模式语法错误抛SyntaxError - 调用可能为 null/undefined 的方法或访问属性前不做防御性检查时
- 强制类型转换失败场景较少,但
Number(undefined)得NaN不报错;真正报错的是后续操作,如NaN.toFixed(2)是合法的,但NaN.toString().padStart()若 NaN 被误当字符串用也可能间接引发问题
推荐的类型安全实践(比依赖异常更主动)
异常处理是兜底,不是主力方案。更健壮的方式是提前做类型检查和防护:
立即学习“Java免费学习笔记(深入)”;
- 用
typeof、Array.isArray()、value === null、value != null等做前置判断,避免走到抛错那步 - 对关键输入做校验函数,比如
isString(val) && val.trim(),而不是等val.trim()报错再 catch - 使用可选链
obj?.prop?.method()和空值合并val ?? 'default'替代大量 try/catch - 第三方库(如 Lodash)提供
_.isString()、_.isFunction()等语义清晰的工具函数
在 catch 中识别具体错误类型
不要只依赖 error.message 字符串匹配(易受国际化或格式变动影响),应使用构造器判断:
err instanceof TypeErrorerr instanceof SyntaxError-
err.constructor.name === 'TypeError'(兼容性更好) - 自定义错误类(如
class ValidationError extends Error)可进一步区分业务逻辑错误


















