定义
NaN是JavaScript的特殊值,表示“非数字”(Not a Number)
<br />
规则
NaN不是数字,但是它的数据类型是数字
typeof NaN; //number
NaN是JavaScript之中唯一不等于自身的值,不等于任何值,包括它本身
NaN == NaN; //false
NaN === NaN; //false
NaN在布尔运算时被当作false
Boolean(NaN); //false
NaN与任何数(包括它自己)的运算,得到的都是NaN
NaN + 32 //NaN
NaN - 32 //NaN
NaN * 32 //NaN
NaN / 32 //NaN
由于数组的indexOf方法,内部使用的是严格相等运算符,所以该方法对NaN不成立
[NaN].indexOf(NaN) //-1 检索的字符串值没有出现,则该方法返回-1
<br />
何时出现
当运算失败或者运算无法返回正确的数值时,就会返回NaN
5 - 'x' //NaN
0 / 0 //NaN
一些数学函数的运算结果会出现NaN
Math.acos(2) //NaN
Math.log(-1) //NaN
Math.sqrt(-1) //NaN
<br />
判断NaN的方法
isNaN()
原理
isNaN()会将括号内的参数利用Number()进行一次转换
如果转换得到的结果NaN → 返回true
如果结果不为NaN → 返回false
示例
由于会对参数用Number()进行一次数据转换,故对于字符串、部分对象、部分数组、undefined等,isNaN()会返回true
isNaN('NaN'); //true 等同于isNaN(Number('NaN'));
isNaN({}); //true 等同于isNaN(Number({}));
isNaN(['xzy']); //true 等同于isNaN(Number(['xzy']));
isNaN(undefined); //true 等同于isNaN(Number(undefined)); Number(undefined)的结果为NaN
但是,对于空数组、只有一个数值成员的数组、null等,isNaN()返回false
isNaN([]); //false
isNaN([123]); //false
isNaN(['123']); //false
isNaN(null); //false Number(null)的结果为0
如何使用
使用isNaN之前,最好判断一下数据类型
function myIsNaN(value){
return typeof value === 'number' && isNaN(value);
}
<br />
Number.isNaN()
与全局函数isNaN()相比,该方法不会强制将参数转换成数字,只有在参数是真正的数字类型,且值为 NaN
的时候才会返回 true
Number.isNaN('NaN'); //false
Number.isNaN({}); //false
Number.isNaN(undefined); //false
Number.isNaN(null); //false
<br />
利用自身不等特性
利用NaN是JavaScript之中唯一不等于自身的值这个特点,进行判断
function myIsNaN(value){
return value !== value;
}