JavaScript中“非有限数值”特指Infinity、-Infinity和NaN,三者均为合法Number类型值,由特定运算自然产生,需用Number.isNaN()或Number.isFinite()严格判断,避免全局函数隐式转换导致误判。

JavaScript 的 Number 类型把“非有限数值”明确限定为三个特殊值:Infinity、-Infinity 和 NaN。它们不是错误,而是合法的 Number 值,但无法参与常规数学比较或作为有效计算结果使用。
非有限数值的来源很明确
这些值通常由特定运算自然产生,不是随意构造的:
-
1 / 0→Infinity -
-1 / 0→-Infinity -
Math.sqrt(-1)、0 / 0、parseInt("abc")→NaN - 超出安全整数范围的运算(如
Math.pow(2, 54))可能返回Infinity或精度丢失,但不直接生成NaN
判断非有限数值不能靠 == 或 ===
NaN !== NaN,Infinity === Infinity 虽成立,但仅靠相等性判断不可靠。必须用专用方法:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
Number.isNaN(x):只对真正的NaN返回true,拒绝字符串"NaN"、null等任何非 Number 类型 -
Number.isFinite(x):仅当x是 number 类型且既不是Infinity、-Infinity,也不是NaN时才返回true - 避免用全局
isNaN()或isFinite():它们会先尝试类型转换,比如isNaN("hello")是true,但你可能只想检查原始值是否本就是NaN
处理策略要分场景
发现非有限值后,如何响应取决于上下文:
立即学习“Java免费学习笔记(深入)”;
- 用户输入校验:用
parseFloat(input)后立刻Number.isFinite(),失败则提示“请输入有效数字” - API 数据清洗:对返回字段做
typeof x === 'number' && Number.isFinite(x)双重检查,过滤掉Infinity等异常值 - 数学函数封装:在函数开头加
if (!Number.isFinite(x)) throw new TypeError('Expected finite number') - 显示层兜底:遇到
NaN或Infinity时,统一渲染为"–"或空字符串,避免暴露技术细节
注意隐式行为带来的陷阱
某些操作看似安全,实则悄悄引入非有限值:
-
+"1e1000"→Infinity(字符串转数字溢出) -
Math.max(...arr)对空数组返回-Infinity -
Math.min(...arr)对空数组返回Infinity -
JSON.parse("null")是null,但JSON.parse("NaN")会报错——说明 JSON 标准根本不支持NaN和Infinity

















