isNaN首先会验证当前检测的值是否本身就是数字类型的,如果不是,浏览器会把默认的值转换为数字类型; 把非数字类型的值转换为数字
- 其他类型的值转化为数字,直接使用Number方法转化,如果当前值中出现任意一个非有效数字字符结果则为NaN;
[字符串转数字]
Number('12') //12
Number('12px') //NaN
Number('12.5') //12.5
[布尔转数字]
Number(true) //1
Number(false) //0
[其他]
Number(null) //0
Number(undefined) //NaN
- 引用类型转化为数字: 先把引用类型的调取toString方法转化为字符串,然后在用Number方法对应的转化;
- 例如:【对象】
({}).toString --> '[object Object]'调取Number -> NAN
- 空字符串数组转换为数字都为0,如下:
Number('') -> 0
Number([]) -> 0
[].toString() --> ''
isNaN([]) -->false
检测当前值是有效数字,返回false,不是返回true(数字类型中只有NaN不是有效数字其余都是有效数字);
parseInt / parseFloat
等同于Number,也是为了把其他类型的值转换为数字类型
区别在于字符串转化分析上
- Number:出现任意非有效数字字符,结果就是NAN
- parseInt:把一个字符串的整数部分解析出来
- parseFloat:把一个字符串的小数或者浮点数部分解析出来
parseInt('13.5px') => 13
parseFloat('13.5px') => 13.5
parseFloat('width:13.5px') => NaN 字符查找从左向右,只要遇到非有效字符则结束查找,所以为你NaN
NaN的比较,他和谁都不相等,包括他自己
此条件永远不成立 因为NaN和任何都不相等:
var a = XXX;
if(Number(a) == NaN) {...}
检测是否为有效数字只有用isNaN:
var a = XXX;
if(isNaN(a)) {}