Number类型采用IEEE754格式来表示整数和浮点数。
整数
最常用的是十进制,也可以通过八进制和十六进制来表示整数。
八进制字面值第一位必须是0,然后是八进制数字序列(0~7)。如果字面值中的数值超过了范围,那么前导零将会被忽略,后面的数值将会被当作十进制解析。
var num1 = 012; // 八进制的10
var num2 = 019; // 无效的八进制数值,解析为19
八进制在严格模式下是无效的,会导致JavaScript引擎抛出聘错误。
浮点数
必须包含一个小数点,并且小数点后面必须至少有一位数字。
小数点前面可以没有数字,但不推荐这种写法。
小数点后没有跟任何数字,则会被解析为整数。
如果浮点数本身就是一个整数,那么将会被转换成整数。
var num3 = 1.; // 小数点后没有数字,解析为1
var num4 = 10.0; // 解析为10
永远不要测试浮点数的值!
数值范围
最小数值:Number.MIN_VALUE——5e-324
最大数值:Number.MAX_VALUE
如果某次计算得到走出范围的值,那么这个值将被自动转换成特殊的Infinity值(负数则为-Infinity)。
Infinity是不能参与计算的数值,所以某次计算得到Infinity值,那么该值将无法参与下一次的计算。
使用isFinite()函数来判断一个数值是不是有穷的。
NaN
Not a Number,非数值,是一个特殊的数值。
任何数除以0,会得到正无穷大或负无穷大。
特点:
1. 任何涉及NaN的操作都会返回NaN
2. NaN与任何值都不相等,包括NaN本身
isNaN函数
任何不能转换成数值的值都会导致这个函数返回true。
isNaN(true); // false,true可以被转换成1
数值转换
有三个函数可以把非数值转换成数值:
- Number():可以用于任何类型
- parseInt():仅用于转换字符串
- parseFloat():仅用于转换字符串
Number()函数的转换规则:
- true => 1,false => 0
- 数字值则直接返回
- null => 0
- undefined => NaN
- 字符串:只包含数字,则转换为十进制数;如果是有效的浮点格式,则转换为浮点数;如果是有效的十六进制格式,则转换为等同的十进制数;如果是空字符串,则转换为0;如果包含除上述格式之外的字符,则转换为NaN
- 对象:先调用valueOf函数,按照前面的规则转换返回的值;如果返回NaN,则调用toString函数,再按照前面的规则转换返回的字符串
注:一元加操作符与Number函数相同
parseInt()函数的转换规则:
- 忽略前面的空格,找到第一个非空格字符,若不是数字字符或者负号,则返回NaN;
- 空字符串会返回NaN;
- 如果第一个字符是数字字符,则会继续解析,直到解析完所有字符,或者遇到非数字字符
- 如果第一个字符是数字字符,还能识别出各种整数格式:以0开头的八进制和0x开头的十六进制。但是ECMAScript 3可以解析八进制,ECMAScript 5引擎中,parseInt函数已经不具有解析八进制的能力,而得到十进制数。
可以为parseInt函数提供第二个参数:转换时使用的基数,即多少进制。如果指定了16为基数,则可以省略前导的0x。
var num = parseInt("AF", 16); // 175
var num2 = parseInt("AF"); // NaN
var num3 = parseInt("10", 2); // 2
var num5 = parseInt("10", 8); // 8
var num5 = parseInt("10", 10); // 10
var num6 = parseInt("10", 16); // 16
建议什么情况下都明确指定基数。
==待确认:var num = parseInt(‘070’);在ECMAScript 3和5下,到底返回什么值?==
parseFloat()函数与parseInt类似:
* 第一个小数点是有效的,之后的小数点是无效的,因此后面的字符串将被忽略;
* parseFloat始终忽略前导的0;
* 十六进制的字符串始终会被转换成0;
* 只解析10进制值,因此没有用第二个参数指定基数的用法;
* 如果字符串包含的是一个可解析为整数的数(没有小数点,或者小数点后都是0),则返回整数
var num = parseFloat('..2'); // NaN