最可靠的方法是使用 typeof x === 'number' && isfinite(x),它能准确排除 nan、infinity、非数字类型,且语义明确为“普通数字”。

要判断一个变量是否为数值且非 NaN,最可靠的方法是结合 typeof 和 isNaN()(或更推荐的 Number.isNaN()),同时注意排除 Infinity(如果业务要求必须是有限数)。
用 typeof + isFinite() 判断(推荐)
isFinite() 能一次性排除 NaN、Infinity、-Infinity 和非数字类型,且只对真正的数字类型返回 true:
-
isFinite(123)→true -
isFinite(NaN)→false -
isFinite(Infinity)→false -
isFinite("123")→false(字符串不通过) -
isFinite(null)→false
用 typeof + Number.isNaN() 组合
如果需要显式检查“是 number 类型且不是 NaN”,可这样写:
typeof x === 'number' && !Number.isNaN(x)- 注意:不要用全局
isNaN(x),它会强制转换(如isNaN("123")返回false,但这是误导) -
Number.isNaN()只对NaN本身返回true,且要求参数必须是 number 类型
避免常见误区
以下方式不可靠:
-
!isNaN(x):对字符串、对象等会隐式转换,导致误判 -
x === +x:虽能过滤 NaN 和 Infinity,但对0和-0都成立,且对字符串如"1"也成立(因"1" === +"1") -
Number(x) === x:同样存在类型转换问题,比如Number("1") === "1"是false,但逻辑易混淆
封装成工具函数(可选)
如果频繁使用,可以封装一个清晰的判断函数:
function isPlainNumber(value) {
return typeof value === 'number' && isFinite(value);
}
这个函数语义明确:必须是 number 类型,且是有限数值 —— 即真正意义上的“普通数字”。











