重读js红宝书之Number类型
Number类型使用IEEE754格式表示整数和浮点数。
常用数值字面量格式:
八进制:第一个数字必须是0,后面是对应的0-7;
十六进制:数值前缀为0x(区分大小写)。然后是对应的0-9 A-F;
其中八进制字面量在严格模式下是无效的,会导致JS引擎抛出语法错误。Es6中的八进制通过0o表示,严格模式下,前缀0会被视为语法错误,应该使用0o表示八进制。
一、浮点数
1.定义浮点值
要定义浮点值,数值中必须包含小数点,而且小数点后面必须至少有一个数字。
因为存储浮点值(64位)使用的内存空间是存储整数值(32位)的两倍,所以ES总是想方设法把值转换为整数。在小数点后面没有数值的情况下,数值就会变成整数。数值本身就是整数的(1.0)也会被转换为整数。
2.科学计数法
对于一个特别大或者特别小的数值,浮点值可以用科学记数法来表示。
ES中科学记数法的格式要求是一个数值后跟一个大写或小写的e,再加上一个要乘的10的多少次幂。例:4.28e6=>4.28*1000000;4.28e-6=>0.00000428;
3.浮点值精确度最高可达17位小数,但远不如整数精确。
0.1+0.2=0.30000000000000004.因为微小的舍入错误,导致很难测试特定的浮点值。
因此不要用“== ” 或’ ==='比较浮点值。
存在舍入错误的原因是使用了IEEE754数值。
二、NaN
特殊的数值,意思是“不是数值”(Not a Number),表示本来要返回数值的操作失败了(而不是抛出错误)。
在ES中,0、-0、+0相除会返回NaN
console.log(0/0); //NaN
console.log(-0/+0); //NaN
console.log(5/0); //Infinity 正无穷大
console.log(-5/0); //-Infinity 负无穷大
NaN特性:
任何涉及NaN的操作始终返回NaN;
NaN不等于包含NaN在内的任何值;
isNaN( n ):用于判断n是否“不是数值”。
传参后,该函数会尝试把参数转换为数值。任何不能被转换为函数的值,函数都会返回true。
console.log(isNaN(NaN)); //true
console.log(isNaN(10)); //false
console.log(isNaN('10')); //false 可以转换为数值10
console.log(isNaN('blue')); //true 不可以转换为数值
console.log(isNaN(true)); //true 可以转换为数值1
三、数值转换
有3个函数可以将非数值转换位数值:
1.Number(): 可以用于任何数据类型
注意:js的number类型有个最大安全值,即2的53次方(9007199254740992),超过这个值就会出现精度丢失的问题。
let str = "123456789012345678";
console.log(Number(str)) // 123456789012345680
转换规则:
参数类型 | 转换结果 |
---|---|
布尔值 | true ->1;false->0 |
数值 | 直接返回 |
null | 返回0 |
undefined | 返回NaN |
字符串 | 空字符串返回0;包含有效的十六进制格式如’0xf’ 返回对应的十进制数值;字符串包含数值字符,直接返回;除以上情况外,均返回NaN。 |
对象 | 调用valueof()方法,并按照上述规则转换,如果转换结果是NaN,则调用toString()方法,再按照转换字符串的规则转换 |
2.parseInt():主要用于将字符串转换为数值
转换规则:
去除字符串最前面的空格,判断第一个字符是否为数值字符或加号、减号,不是的话,立即返回NaN,所以空字符串也会返回NaN。然后依次检测每个字符,直到字符串末尾或非数值字符。并且parseInt()也能识别不同的整数格式("0x"开头=》16进制;'0’开头在非严格模式下解释为进制)。
parseInt()接收第二个参数,用来指定进制数:
parseInt(' 1234asd'); //1234
parseInt(' '); //NaN
parseInt(22.5); //22
parseInt('AF',16); //175
parseInt('AF'); //NaN
3.parseFloat():主要用于将字符串转换为数值.
从第一个字符开始解析到末尾或者解析到一个无效的浮点数值为止。
parseFloat()始终忽略字符串开头的0.
parseFloat()只解析十进制值,不能指定底数。
十六进制数值始终会返回0.