安全获取数字需避免隐式转换和NaN意外:优先用Number()、parseInt()、parseFloat()等显式方法,结合正则校验与isNaN/Number.isNaN检测,并在运算前确保操作数为有效数字。

安全获取数字,关键是避免隐式转换和 NaN 意外。优先用显式方法,并结合校验逻辑。
字符串转数字:按场景选对函数
不同输入格式对应不同处理方式:
-
纯数字字符串(如 "123"、" 45 "):用
Number()或一元加号+"123",简洁且行为明确;但遇到非法字符(如"12px")会直接返回NaN -
带单位或前缀的字符串(如 "42px"、"0x2A"):用
parseInt(str, 10)提取开头整数(注意必须传进制 10),或parseFloat("3.14em")提取浮点数 -
需要强校验的表单输入:先用正则判断是否为有效数字格式(如
/^-?\d+\.?\d*$/.test(input)),再用Number()转换
防 NaN:每次转换后都应检查
NaN 是 number 类型但不等于自身,不能用 === 判断。正确检测方式:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
- 用
isNaN(value)—— 会先尝试转数字再判断(适合大多数情况) - 用
Number.isNaN(value)—— 只对已是NaN的值返回 true(更严格,推荐用于已知是数字类型的场景) - 用
typeof value === 'number' && !isNaN(value)确保是有效数字
特殊值要心里有数
这些常见输入的转换结果容易被忽略:
立即学习“Java免费学习笔记(深入)”;
-
Number("")→0(空字符串不是NaN) -
Number(null)→0,Number(undefined)→NaN -
parseInt("", 10)→NaN,parseFloat("")→NaN -
+"0"、+"false"、+" "都不会报错,但语义上只有+"0"是合理数字
比较或运算前,务必统一类型
不要依赖 == 或 + 触发的隐式转换:
- 写
if (value == 42)可能因字符串"42"通过,但逻辑本意是“数值相等”——应改写为Number(value) === 42 - 做加减乘除前,确保操作数已是数字:
const a = Number(inputA); const b = Number(inputB); if (!isNaN(a) && !isNaN(b)) { return a + b; }

















