isnan() 会先尝试将参数转换为数字,再判断是否为 nan,而 number.isnan() 仅对严格等于 nan 的值返回 true。这意味着 isnan('123') 为 false,但 number.isnan('123') 也为 false;isnan(nan) 和 number.isnan(nan) 均为 true。推荐使用 number.isnan() 以避免隐式类型转换带来的意外结果。

isNaN() 的隐式转换行为
isNaN() 在判断前会调用 ToNumber 抽象操作将输入转为数字。例如 isNaN('hello') 会先将 'hello' 转为 NaN,因此返回 true。这种设计导致 isNaN(undefined)、isNaN(null) 甚至 isNaN(true) 都可能产生非直观的结果。

console.log(isNaN(NaN)); // true
console.log(isNaN('NaN')); // true, 因为 'NaN' 被转为 NaN
console.log(isNaN('123')); // false, 因为 '123' 被转为 123
console.log(isNaN(undefined)); // true, 因为 undefined 被转为 NaN
console.log(isNaN(null)); // false, 因为 null 被转为 0
console.log(isNaN(true)); // false, 因为 true 被转为 1
Number.isNaN() 的类型安全特性
Number.isNaN() 不会进行任何类型转换。它首先检查值是否为数类型,如果不是则直接返回 false。只有当值的类型为 number 且其值为 NaN 时,才返回 true。这使得它在处理用户输入或 API 响应时更加可靠。

console.log(Number.isNaN(NaN)); // true
console.log(Number.isNaN('NaN')); // false, 类型不是 number
console.log(Number.isNaN('123')); // false, 类型不是 number
console.log(Number.isNaN(undefined)); // false, 类型不是 number
console.log(Number.isNaN(null)); // false, 类型不是 number
console.log(Number.isNaN(true)); // false, 类型不是 number
console.log(Number.isNaN(123)); // false, 值是 number 但不是 NaN
如何处理非数字类型的 NaN 检测
当需要检测一个可能为非数字类型的值是否为 NaN 时,应结合类型检查和 Number.isNaN()。例如,对于字符串输入,可以先尝试解析,若解析失败则视为无效数据。以下代码展示了如何安全地处理混合类型输入:
function safeIsNaN(value) {
if (typeof value !== 'number') {
return false;
}
return Number.isNaN(value);
}
console.log(safeIsNaN(NaN)); // true
console.log(safeIsNaN('NaN')); // false
console.log(safeIsNaN(undefined)); // false
console.log(safeIsNaN(null)); // false
console.log(safeIsNaN(true)); // false
console.log(safeIsNaN(123)); // false
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











