最可靠的方式是组合使用 typeof 和 Number.isFinite()。Number.isFinite() 只对类型为 number 且值为有限数字返回 true,天然排除 NaN、Infinity、非数字类型;而 isNaN() 和全局 isFinite() 存在隐式转换问题,不可靠。

JavaScript 中判断一个值是否为“合法的 Number 类型”,关键在于区分三个概念:是否是 number 基本类型、是否为有效数字(非 NaN)、是否为有限数字(非 Infinity)。最可靠的方式是组合使用 typeof 和 Number.isFinite()。
用 Number.isFinite() 最准确
Number.isFinite() 是 ES6 引入的专用方法,它只对「类型为 number 且值为有限数字」返回 true,天然排除 NaN、Infinity、-Infinity 以及非数字类型(如字符串、null、对象等)。
-
Number.isFinite(123)→true -
Number.isFinite(0)→true -
Number.isFinite(-45.6)→true -
Number.isFinite(NaN)→false -
Number.isFinite(Infinity)→false -
Number.isFinite("123")→false(字符串不是 number 类型) -
Number.isFinite(null)→false
避免误用 isNaN() 和 isFinite()
isNaN() 会先尝试把参数转成数字再判断,导致意外结果;window.isFinite()(即全局 isFinite())也有隐式转换问题。
-
isNaN("123")→false(但你可能不希望字符串被当作合法数字) -
isNaN({})→true(因为{}转数字是NaN) -
isFinite("1e2")→true(字符串被转成100) -
isFinite("abc")→false(但这是靠转换失败实现的,不严谨)
这些行为违背“检测是否为合法 Number 类型”的本意——我们关心的是值本身是不是 number 类型,而不是它能不能被解析成数字。
立即学习“Java免费学习笔记(深入)”;
如果需要兼容旧环境(IE)
IE 不支持 Number.isFinite(),可手动模拟:
function isValidNumber(value) {
return typeof value === 'number' && isFinite(value);
}
注意:这里用的是全局 isFinite(),但它在传入非 number 类型时会先转换,所以必须加 typeof value === 'number' 前置判断,否则 isValidNumber("123") 会返回 true —— 这不是我们想要的。
不推荐依赖 typeof x === 'number' 单独判断
typeof NaN 是 "number",typeof Infinity 也是 "number"。仅靠 typeof 无法排除非法数值。
-
typeof NaN === 'number'→true -
typeof Infinity === 'number'→true -
typeof 0 === 'number'→true
所以单独用 typeof 只能确认是 number 类型,不能确认是否“合法”。必须结合数值有效性检查。


















