Number类型
整数
JavaScript对整数提供四种表示方法:
- 二进制:有前缀0b的数值,出现0,1以外的数字会报错
- 八进制:八进制第一位必须是零(0),然后是八进制数字序列(0~7),超过范围前面的0将被忽略,后面的数值按十进制数值解析
注意:八进制字面量在严格模式下是无效的,会导致支持该模式的JavaScript引擎抛出错误 - 十六进制:十六进制前两位必须是0x,后跟十六进制数字(0 ~ 9及A ~ F),A ~ F可大写也可小写
- 十进制
var num2 = 0b11;
console.log(num2);//3
var num2 = 0b12;
console.log(num2);//报错
var num8 = 077;
console.log(num8)//63
var num8 = 078;
console.log(num8);//78
var num16 = 0x2a;
console.log(num16);//42
var num16 = 0x2g;
console.log(num16);//报错
浮点数
所谓浮点数,就是该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字。与整数不同,浮点数只能用十进制来表示
注意:浮点数的精度远远不如整数,所以计算时精确度远远不如整数
console.log(0.1 + 0.2 == 0.3); //false 0.30000000000000004
console.log(0.6/0.2); //2.9999999999999996
对于极大或者极小的数值可以使用科学记数法(e表示法),用e表示法表示的数值等于e前面的数值乘以10的e后面数值次幂
console.log(3.14e7==31400000)//true
数值范围
由于内存的限制,ECMAScript并不能保存世界上所有的数值,所以就有了最大值和最小值
最小值保存在Number.MIN_VALUE中,这个值是5e-324
最大值保存在Number.MAX_VALUE,这个值是1.7976931348623157e+308
超出该范围则则会被转换为Infinity或0
console.log(Number.MAX_VALUE);//1.7976931348623157e+308
console.log(Number.MIN_VALUE);//5e-324
console.log(2.7976931348623157e+308)//infinity
console.log(5e-325)//0
使用isFinite()函数判断一个数值是否有穷,若是,则返回true
var result = Number.MAX_VALUE + Number.MAX_VALUE;
console.log(isFinite(result)); //false
数值转换
有三个函数可以把非数值转换为数值:Number( ),parseInt( )和parseFloat( )。其中,Number( )可以用于任何数据类型,而另外两个函数专门用于把字符串转化成数值
1.Number( )
转换规则
-
如果是Boolean值,true和false将分别转换为1和0
-
如果是null值,返回0
-
如果是undefined,返回NaN
-
如果是字符串,遵循以下规则:
(1)若字符串只包含十进制或十六进制数字,则转成十进制的数字
注意:Number()不识别八进制数字的字符串,会按照十进制数字处理
(2)若字符串为空字符串或空格字符串,则转成0
(3)其他情况的字符串,则转成NaN
var num1 = Number(true);//1
var num2 = Number(false);//0
var num3 = Number(null);//0
var num4 = Number(undefined);//NaN
var num5 = Number("1.32");//1.32
var num6 = Number(1.32);
var num7 = Number("");//0
var num8 = Number("hi");//NaN
2.parseInt( )
parseInt()专门用于把字符串转换成整数。在转换字符串时,会忽略字符串前面的空格,直到找到第一个非空格字符。如果第一个字符不是数字字符或者负号,parseInt()就会返回NaN。如果是,则继续解析,直到解析完成或者遇到非数字字符
console.log(parseInt("123blue"));//123
console.log(parseInt(""));//NaN
console.log(parseInt("0xA"));//10
console.log(parseInt("123.456"));//123
console.log(parseInt("070"));//70不解析八进制
注意:在ECMAScript5中,parseInt()已经不具备解析八进制的能力。例如八进制“070”,会忽略前面的“0”,得到十进制的70
为了消除在使用parseInt()函数时可能导致的上述困惑,可以为这个函数提供第二个参数:第一个参数的基底(第一个参数是什么进制?),然后parseInt()函数将第一个参数转换为十进制整数
console.log(parseInt("70",8));//56
console.log(parseInt("70",16))//112
console.log(parseInt("70",10))//70
3.parseFloat( )
parseFloat( )专门用于字符串转换浮点数。同样地,解析时会忽略字符串前面的空格,直到找到第一个非空格字符,然后一直解析到字符串末尾或一个无效的浮点数字字符为止
需要注意的两点:
- parseFloat( )始终会忽略前导的零,所以parseFloat( )只解析十进制,且无第二个参数;
- parseFloat( )若遇到一个可解析为整数的数,则会返回整数
console.log(parseFloat("123blue"));//123
console.log(parseFloat("22.5"));//22.5
console.log(parseFloat("22.5.7"));//22.5
console.log(parseFloat("022.5"));//22.5
NaN(非数值)
NaN即为非数值,这个数值表示一个本来要返回数值的操作数未返回数值的情况,NaN具有两个特点:
- 任何涉及NAN的操作都会返回NaN
- NaN与任何值都不相等,包括NaN本身
console.log(10/NaN);//NaN
console.log(NaN == NaN);//false
isNaN()函数用来判断参数是否”不是数值“,isNaN()在接收到一个值后,会尝试将这个值转换为数值,任何不能转换为数值的值都会返回true
console.log(isNaN(NaN));//true
console.log(isNaN(10));//false
console.log(isNaN("10"));//false
console.log(isNaN(true));//false
console.log(isNaN(null));//false
console.log(isNaN("blue"));//true
参考
《JacaScript高级程序设计(第三版)》