? 首先明确一点,NaN不是独立的数据类型,而是一个特殊数值,它的数据类型依然属于Number。
typeof NaN
一、那么NaN有哪些特点?
- NaN不等于NaN
NaN === NaN
由此,联想到indexOf函数,它内部使用的是===来做比较,如下:[NaN].indexOf(NaN)
再次联想,includes函数呢?来看结果[NaN].includes(NaN)
为什么呢,因为它内部使用的相等机制,是零值相等 - NaN和任何数的运算,结果都是NaN
NaN + 1
NaN - 2
NaN * 3
NaN / 4
NaN + '2'
二、这么牛逼的一个值,如何判断是否是它呢
js官方提供,isNaN函数,如下:
isNaN(NaN)
但是请注意,isNaN只对数值有效,如果传入其他值,会被先转成数值。
比如,传入字符串的时候,会先使用Number转值,所以最后返回true,这一点要特别引起注意。也就是说,isNaN为true的值,有可能不是NaN,而是一个字符串。
我们来做一些实验
isNaN('Hello')
isNaN({})
isNaN([1])
isNaN(['1'])
isNaN(['xzy'])
isNaN([])
乱七八糟一顿测试,凉了,该函数根本无法来判断,不过你是否忘记上面的特性的第一条,NaN不等于NaN,我们根据该特性,自己写个函数如何?
function myIsNaN(value) {
return value !== value;
}
myIsNaN(1)
myIsNaN('1')
myIsNaN(null)
myIsNaN(undefined)
myIsNaN([])
myIsNaN({})
myIsNaN([1])
myIsNaN(['1'])
myIsNaN(['xyz'])
myIsNaN(NaN)
?
|