isNaN 函数

在 JavaScript 中 NaN 不能通过 ==, !=, ===, !== 等操作符来比较是否相等. JavaScript 提供了一个全局的函数 isNaN(), 用来确定一个值是不是 NaN; 同时, ES2015 中添加了一个函数 Number.isNaN(), 功能和全局的 isNaN() 类似, 这两个函数有一些区别.

isNaN()

isNaN() 会首先将参数强制转换为 Number, 如果不能转换为 Number, isNaN() 函数会返回 true. 也就是说,如果这个值不能被转换(如果需要)为一个有效的 Number, 那么这个值就是一个 NaN, isNaN 就会返回true.

所以, 对于字符串来说, isNaN() 函数显得比较奇怪. 比如说, 字符串 ‘123’ 是字符串,理论上来说不是字符串, 但是 isNaN() 却返回 false.

例子:

1
2
3
4
5
6
7
isNaN(undefined): true
isNaN(null): false
isNaN(''): false
isNaN('12'): false
isNaN(true): false
isNaN(false): false
isNaN({}): true

Number.isNaN()

这个函数是在 ES2015 里添加的,用来判断一个 Number 类型的值是不是 NaN. 它和全局的 isNaN() 函数的重要区别是, Number.isNaN() 不对传入的参数做强制类型转换.

所以对于非 Number 类型的值, 都会返回 false:

1
2
3
4
5
6
7
Number.isNaN(undefined): false
Number.isNaN(null): false
Number.isNaN(''): false
Number.isNaN('12'): false
Number.isNaN(true): false
Number.isNaN(false): false
Number.isNaN({}): false

返回 true:

1
2
3
Number.isNaN(NaN)
Number.isNaN(Number.NaN)
Number.isNaN(0/0)

注意:

Number.isNaN(0/0) 返回 true, 其它除以 0 情况都返回 false.

参考: