问题的发现
//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与+0、NaN与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