JavaScript中判断变量是否为NaN

351 阅读1分钟

问题的发现

//parseInt()为可以将某类型的值转换为Int类型
parseInt(null) === NaN  //false
parseInt(null) === 'NaN'  //false
parseInt(null)  //NaN

parseInt('') === NaN  //false
parseInt('') === 'NaN'  //false
parseInt('')  //NaN

问题的原因

NaN 的特性为不等于任何值(包括自己)
因此

NaN === NaN  //false

解决方法

1、利用特性

因为NaN不等于他本身,所以不等于自己本身的就是NaN

parseInt(null) !== parseInt(null)  //true
parseInt('') !== parseInt('')  //true
NaN !== NaN  //true

2、isNaN

isNaN是专门判断NaN的函数,弊端就是有自动转换类型的功能
对于string等类型会自动转换为number,也就变成了NaN,这也就就违背了我们的初衷

isNaN(parseInt(null))  //true
isNaN(parseInt(''))  //true
isNaN(NaN)  //true
isNaN('NaN')  //true
isNaN( )  //true
isNaN({})  //true
isNaN(undefined)  //true
isNaN(null)  //true

3、Number.isNaN

Number.isNaN是CS6新增的,很精确

Number.isNaN(parseInt(null))  //true
Number.isNaN(parseInt(''))  //true
Number.isNaN(NaN)  //true
Number.isNaN('NaN')  //false
Number.isNaN( )  //false
Number.isNaN({})  //false
Number.isNaN(undefined)  //false

4、Object.is()

Object.is()是CS6新增的,用来判断两个值是否相同,这里的效果跟Number.isNaN一样
Object.is()跟 === 基本一样,唯一不同就是 -0与+0NaN与NaN

Object.is(parseInt(null), NaN)  //true
Object.is(parseInt(''), NaN)  //true
Object.is(NaN, NaN)  //true
Object.is('NaN', NaN)  //false
Object.is( , NaN)  //false
Object.is({}, NaN)  //false
Object.is(undefined, NaN)  //false

Object.is(NaN, NaN)  //true
Object.is(-0, +0)  //false
NaN === NaN  //false
-0 === +0  //true