JavaScript中判断有效数字应使用isFinite(x),它精准识别有限数(非NaN、非±Infinity);安全转换字符串需trim后Number再isFinite校验;检测NaN唯一可靠方式是Number.isNaN(x)。

JavaScript 的 Number 类型有三个特殊值:NaN、Infinity 和 -Infinity。它们不满足常规数字的直觉行为(比如 NaN !== NaN),直接用 == 或 === 判断容易出错。写工具函数前,先明确目标:安全识别、合理转换、避免隐式陷阱。
判断是否为有效数字(排除 NaN、Infinity)
仅靠 typeof x === 'number' 不够——它对 NaN 和 Infinity 也返回 true。真正“可用”的数字需同时满足:是 number 类型、不是 NaN、也不是无穷大。
-
isFinite(x)是最简洁可靠的方案:它返回true当且仅当x是有限数字(即非NaN、非±Infinity) - 避免手写
x !== NaN && x !== Infinity && x !== -Infinity——因为NaN !== NaN恒为false,该判断永远失败 - 注意:
isFinite('123')会先尝试转换字符串,结果为true;如需严格类型检查,先用typeof x === 'number'再调isFinite
安全转换字符串为数字
用户输入或 API 返回的字符串常含空格、单位、无效字符(如 ' 42px ' 或 'abc')。直接用 Number() 或一元 + 会产生 NaN,而 parseInt/parseFloat 有截断风险(如 parseInt('1.99') → 1)。
- 推荐组合:
const num = Number(str.trim()); return isFinite(num) ? num : null; - 若需默认值,可封装为
toNumber(str, fallback = 0),内部做 trim → Number → isFinite 判断 - 避免依赖
isNaN():它会强制转数字再判断,isNaN('abc')是true,但isNaN({})也是true(因{} → NaN),易引发意外
区分 NaN 和其他假值
NaN 是唯一不等于自身的值,也是唯一 typeof 为 'number' 的假值(!NaN === true)。但 0、''、null 等也是假值,不能混为一谈。
立即学习“Java免费学习笔记(深入)”;
- 检测 NaN 的唯一可靠方式是
Number.isNaN(x)(ES6+),它不进行类型转换,Number.isNaN('NaN')返回false - 旧环境可用
x !== x——这是 NaN 的数学特性,但可读性差,建议优先用Number.isNaN - 不要用全局
isNaN(x),它会先调Number(x),导致isNaN(' ') → false(因' ' → 0),而isNaN('a') → true,行为不一致
处理 Infinity 的边界场景
Infinity 常出现在除零(1 / 0)、溢出(Number.MAX_VALUE * 2)或显式赋值中。它参与运算时可能静默传播(如 Infinity + 1 → Infinity),需主动拦截。
- 用
isFinite()可一并过滤±Infinity;若需单独识别,用x === Infinity或x === -Infinity - 与后端交互时,JSON 不支持
Infinity,JSON.stringify(Infinity)返回null,可能导致数据丢失,发送前应校验并替换(如转为null或特定字符串) - 比较大小时,
Math.max(1, 2, Infinity)返回Infinity,但若业务不允许,应在计算前过滤掉无穷值


















