NaN
(1)含义
NaN是JavaScript的特殊值,表示“非数字”(Not a Number),主要出现在将字符串解析成数字出错的场合。
5 - 'x' // NaN
上面代码运行时,会自动将字符串“x”转为数值,但是由于x不是数字,所以最后得到结果为NaN,表示它是“非数字”(NaN)。
另外,一些数学函数的运算结果会出现NaN。
Math.acos(2) // NaN Math.log(-1) // NaN Math.sqrt(-1) // NaN
0除以0也会得到NaN。
0 / 0 // NaN
需要注意的是,NaN不是一种独立的数据类型,而是一种特殊数值,它的数据类型依然属于Number,使用typeof运算符可以看得很清楚。
typeof NaN // 'number'
(2)运算规则
NaN不等于任何值,包括它本身。
NaN === NaN // false
由于数组的indexOf方法,内部使用的是严格相等运算符,所以该方法对NaN不成立。
[NaN].indexOf(NaN) // -1
NaN在布尔运算时被当作false。
Boolean(NaN) // false
NaN与任何数(包括它自己)的运算,得到的都是NaN。
NaN + 32 // NaN NaN - 32 // NaN NaN * 32 // NaN NaN / 32 // NaN
(3)判断NaN的方法
isNaN方法可以用来判断一个值是否为NaN。
isNaN(NaN) // true isNaN(123) // false
但是,isNaN只对数值有效,如果传入其他值,会被先转成数值。比如,传入字符串的时候,字符串会被先转成NaN,所以最后返回true,这一点要特别引起注意。也就是说,isNaN为true的值,有可能不是NaN,而是一个字符串。
isNaN("Hello") // true // 相当于 isNaN(Number("Hello")) // true
出于同样的原因,对于数组和对象,isNaN也返回true。
isNaN({}) // true isNaN(Number({})) // true isNaN(["xzy"]) // true isNaN(Number(["xzy"])) // true
因此,使用isNaN之前,最好判断一下数据类型。
function myIsNaN(value) { return typeof value === 'number' && isNaN(value); }
判断NaN更可靠的方法是,利用NaN是JavaScript之中唯一不等于自身的值这个特点,进行判断。
function myIsNaN(value) { return value !== value; }