真正能抛出异常的类型转换操作包括:json.parse(非法字符串抛syntaxerror)、bigint(非法字面量抛syntaxerror)、atob/btoa(base64失败抛invalidcharactererror);new date不直接抛错但返回invalid date需手动检查。

JavaScript 类型转换本身大多不会抛出运行时异常,但某些显式转换操作(比如 JSON.parse、new Date(str)、parseInt 或 Number 在特定上下文中配合校验逻辑)可能间接暴露错误,或需要你主动判断转换结果是否有效。真正能“捕获异常”的,是那些**可能抛出错误的解析/构造类操作**,而非基础类型转换本身。
哪些类型转换操作会真正抛出异常?
以下操作在失败时会触发 throw,可被 try...catch 捕获:
-
JSON.parse(str):字符串格式非法时抛出SyntaxError -
new Date(dateString):日期字符串无法解析时虽不报错,但返回Invalid Date(需手动检查);而某些严格解析场景(如配合Intl.DateTimeFormat)可能抛出RangeError或TypeError -
atob(str)/btoa(str):Base64 编解码失败时抛出InvalidCharacterError(DOM 异常) -
BigInt(str):传入非合法整数字面量(如含小数点、空格、前导零等)时抛出SyntaxError
基础类型转换(如 Number、String、Boolean)不抛异常,但要防 NaN 和意外值
它们失败时返回“安静”的无效值(如 NaN、"NaN"、false),不会中断执行。因此处理重点是事后验证,而非 try...catch:
-
Number("abc") → NaN→ 用isNaN()或Number.isNaN()判断 -
parseInt("12px", 10) → 12(静默截断)→ 若需严格校验,应配合正则或Number()+isFinite() -
String(null) → "null",String(undefined) → "undefined"→ 若期望空字符串,需额外处理
推荐的安全转换封装模式
把“尝试转换 + 验证 + 错误处理”逻辑封装成可复用函数,兼顾健壮性和语义清晰:
// 安全转数字:只接受纯数字字符串,否则返回 null 或默认值
function safeParseInt(str, defaultValue = null) {
if (typeof str !== 'string' || !/^-?\d+$/.test(str)) {
return defaultValue;
}
const num = parseInt(str, 10);
return isFinite(num) ? num : defaultValue;
}
// 安全解析 JSON
function safeJsonParse(str, defaultValue = null) {
try {
return JSON.parse(str);
} catch (e) {
console.warn('JSON 解析失败:', e.message, '输入:', str);
return defaultValue;
}
}
异步转换中的错误捕获要特别注意
如果转换逻辑发生在 Promise 内部(例如从接口取字符串再 JSON.parse),记得在 Promise 链中用 .catch(),或在 async/await 中用 try/catch:
- ❌ 错误写法:
fetch(...).then(r => r.json()).then(data => ...)——r.json()失败会变成 rejected Promise,但没被捕获 - ✅ 正确写法:
fetch(...).then(r => r.json()).then(...).catch(err => {...}) - ✅ 或:
async function loadData() { try { const r = await fetch(...); const data = await r.json(); } catch (e) { ... } }
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











