isNaN 与 Number.isNaN 的区别

isNaN 会进行类型转换,Number.isNaN 只判断数字类型的 NaN

问题

isNaNNumber.isNaN 函数有什么区别?

解答

NaN 的特殊性

NaN(Not-A-Number)是 JavaScript 中的特殊值,表示不是一个数字。它最特殊的地方是无法通过相等运算符判断:

NaN == NaN   // false
NaN === NaN  // false

因此需要专门的方法来判断一个值是否为 NaN。

isNaN()

全局函数 isNaN() 会先尝试将参数转换为数值,任何不能转换为数值的值都会返回 true

isNaN(NaN)        // true
isNaN('hello')    // true - 字符串无法转换为数字
isNaN(undefined)  // true
isNaN({})         // true
isNaN('123')      // false - 可以转换为数字 123

Number.isNaN()

Number.isNaN() 会先判断参数是否为数字类型,只有当参数是数字且值为 NaN 时才返回 true,不会进行类型转换:

Number.isNaN(NaN)        // true
Number.isNaN('hello')    // false - 不是数字类型
Number.isNaN(undefined)  // false
Number.isNaN({})         // false
Number.isNaN('123')      // false

关键点

  • isNaN() 会将参数转换为数字再判断,非数字值也可能返回 true
  • Number.isNaN() 只对数字类型的 NaN 返回 true,不进行类型转换
  • Number.isNaN() 是更准确、更严格的 NaN 判断方法
  • NaN 无法通过 ===== 与自身比较来判断