Number.isFinite() 是最准确、最推荐的方式,因为它只接受类型为 number 且值为有限数(非 Infinity、-Infinity、NaN)的参数,而 isFinite() 会强制类型转换导致语义模糊。

用 Number.isFinite() 是最准确、最推荐的方式。
为什么不用 isFinite()?
isFinite() 会先尝试把参数转成数字,再判断是否有限。这容易导致意外结果:
-
isFinite("123")→true(字符串被转成数字) -
isFinite("")→true(空字符串转为0) -
isFinite("abc")→false(转成NaN,而NaN不是有限数)
它不区分“本来就是数字”和“能被转成数字”的情况,语义模糊。
Number.isFinite() 才是真正判断“是否为有限数字”
它只接受真正类型为 number 的值,且值必须是有限的(即不是 Infinity、-Infinity 或 NaN):
立即学习“Java免费学习笔记(深入)”;
-
Number.isFinite(123)→true -
Number.isFinite(0)→true -
Number.isFinite(-45.6)→true -
Number.isFinite(Infinity)→false -
Number.isFinite(-Infinity)→false -
Number.isFinite(NaN)→false -
Number.isFinite("123")→false(不是 number 类型) -
Number.isFinite(null)→false
注意边界情况
这些值常被误认为“是数”,但其实不符合“有限数字”的定义:
-
Number.isFinite(Number.MAX_VALUE)→true(最大安全值仍是有限的) -
Number.isFinite(Number.MAX_SAFE_INTEGER)→true -
Number.isFinite(1 / 0)→false(结果是Infinity) -
Number.isFinite(Math.pow(2, 1024))→false(溢出为Infinity)
简单封装(按需)
如果项目中需要兼容极老环境(如 IE),可加一层兜底,但现代项目基本无需:
function isFiniteNumber(value) {
return typeof value === 'number' && isFinite(value);
}
这个写法逻辑等价于 Number.isFinite(),但更啰嗦,建议直接用原生方法。


















