NaN, 即非数值 (Not a Number) 是一个特殊的值, 这个数值表示本来要返回数值的操作数未返回数值的情况 (这样就不会抛出错误了) 比如在其他语言中
任何数值除以 0 都会导致错误而终止程序执行但是在 ECMAScript 中, 会返回出特殊的值, 因此不会影响程序的执行
var box=0/0; //NaN;
var box=12/0; //Infinity;
var box=12/0*0; //NaN;
可以通过 Number.NaN 得到 NaN 的值, 任何与 NaN 进行运算的结果均会为 NaN,NaN 与自身不相等 (NaN 不与任何值相等)
alert(Number.NaN); //NaN
alert(NaN+1); //NaN
alert(NaN==NaN); //false
ECMAScript 提供 isNaN() 函数, 用来判断这个是不是 NaNisNaN() 函数在接收到一个值后, 会尝试将这个值转换成数值
alert(isNaN(NaN)); //true;
alert(isNaN(25)); //false 25 是个数值
alert(isNaN('25')); //false '25'是一个字符串数值, 可以转换成数值
alert(isNaN('Lee')); //true 'Lee'是个字符串, 不能转化成数值
alert(isNaN(true)); //false true 可以转换成 1
isNaN() 函数也适用于对象在调用 isNaN() 函数过程中, 首先会调用 valueOf() 方法, 然
后确定返回值是否能够转换成数值如果不能, 则基于这个返回值再调用 toString() 方法,
再测试返回值
var box = {
toString: function() {
return 'lee';
}
};
alert(isNaN(box));
有三个函数可以把非数值转换成数值: Number()parseInt() 和 parseFloat()Number() 是转换型函数, 可以用于任何数据类型, 而另外两个则
专门用于把字符串转换成数值
alert(Number(true)); //1,Boolean 类型的 true 和 false 分别转换成 1 和 0
alert(Number(25)); //25, 数值类型直接返回
alert(Number(null)); //0, 空对象返回 0
alert(Number(undefined));//NaN,undefined 返回 NaN
如果是字符串增寻以下规则:
1 只包含数值的字符串, 会直接转换成十进制数值, 如果包含前导 0, 即会自动去掉
alert(Number('456')); //465
alert(Number('070')); //70
2 只包含浮点数值的字符串, 会直接转换成浮点数值, 如果包含前导和后导 0, 即会自动去掉
alert(Number('08.50')); //8.5
3 如果字符串为空, 那么直接转换成 0.
alert(Number('')); //0
4 如果不是以上三种字符串类型, 则会返回 NaN
alert(Number('lee123')); //NaN
5 如果是对象, 首先会调用 valueOf() 方法, 然后确定返回值是否能够转化成数值如果转化的结果是 NaN, 则基于这个返回值再调用 toString() 方法, 在测试返回值
var box = { toString: function() {
return '123';
}
};
alert(Number(box)); //123
var box = { toString: function() {
return 'lee';
}
};
alert(Number(box)); //NaN
由于 Number() 函数在转换字符串时比较复杂且不够合理, 因此在处理整数的时候更常用的是 parseInt()
alert(parseInt('465lee')); //465, 返回整数部分
alert(parseInt('lee465lee')); //NaN, 如果第一个不是数值, 就会返回 NaN
alert(parseInt('12lee56lee')); //12, 从第一个数值开始取, 到最后一个连续数值结束
alert(parseInt(56.12)); //56, 小数点不是数值, 会被去掉
alert(parseInt('')); //NaN, 空返回 NaN
parseInt() 除了可以识别十进制数, 开可以识别八进制和十六进制
alert(parseInt('0xA')); //10, 十六进制
alert(parseInt('070')); //56, 八进制
alert(parseInt('0xALee')); //100, 十六进制, Lee 被自动过滤
ECMAScript 为 parseInt() 提供了第二参数, 用于解决各种的进制转换
alert(parseInt('0xAF')); //175, 十六进制
alert(parseInt('AF',16)); //157, 第二参数指定十六进制, 可以去掉 0x 前导
alert(parseInt('AF')); //NaN, 这里看作字符串, 理所当然 NaN
alert(parseInt('101010101',2)); //314, 二进制转换
alert(parseInt('70',8)); //56, 八进制转换
parseFloat() 是用于浮点数值的转换, 和 parseInt() 一样, 从第一位解析到浮点数值位置
alert(parseFloat('123Lee')); //123, 去掉不能识别的部分
alert(parseFloat('0xA')); //0, 不认识十六进制
alert(parseFloat('123.4.5')); //123.4, 只认一个小数点
alert(parseFloat('0123.400')); //123.4 去掉前后导
alert(parseFloat('1.234e7')); //12340000, 把科学计数法转换成普通数值
来源: http://www.92to.com/bangong/2018/02-01/33247479.html