ES6之基本类型:数值与Number

数值

js的数值具有以下几条特征:
1.不区分整数值和浮点数值。
2.所有数值均用浮点数值表示。
3.采用IEEE-754标准定义的64位浮点数格式表示。(整数在实际操作时(如数组索引),则是基于32位整数)

ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示。

0b111110111 === 503 // true
0o767 === 503 // true

(但在ES6的严格模式下,禁止使用八进制)

浮点数直接量
实数写法:由整数部分、小数点和小数部分组成。
如:3.1415926
(存储时用)指数记数法:在实数部分后跟字母e或E,再跟正负号,在跟一个整型的指数。
如:5.12e12-> 5.12×10^12
1.44E-8 -> 1.44×10^-8

算术运算
运算符:
包括:+、-、*、/、%、**(指数操作符,ES6新增)
溢出(overflow):
当数值运算结果超过了JavaScript能表示的数值上限时发生。
结果为Infinity,若超过了负数范围,则为-Infinity。
基于±Infinity的加、减、乘、除等算术运算结果依然是±Infinity。
Infinity/Infinity=NaN
下溢(underflow):
当运算结果无限接近于零,并比JavaScript能表示的最小值还小时发生。
JavaScript会返回0,若当一个负数发生下溢时,则返回-0。
被零整除:
简单的返回±Infinity,0/0=NaN

二进制浮点数与四舍五入错误
实数有无数个,但JavaScript通过浮点数的形式只能表示其中有限个数。
当JavaScript使用实数时,常常只是真实值的一个近似表示。
IEEE-754浮点数表示法是一种二进制表示法,可以精确地表示分数。如:1/2、1/8和1/1024等。
但常用的分数都是十进制分数,二进制浮点数并不能精确表示类似0.1这样的简单数值。
如:0.3-0.2 -> 0.09999999999999998
任何使用二进制浮点数的编程语言中都会有这个问题。
建议,尽可能使用大整数进行等比修正以避免该类错误。如:3-2

数值转换
JavaScript提供了3个函数可将非数值转换为数值。
Number( )、parseInt( )和parseFloat( )

Number(false)//如果是Boolean值,true和false值将分别被转换为1和0。
Number(null)//如果是null值,返回0
Number(undefined)//如果是undefined,返回NaN。
Number("011")//如果字符串中只包含数字时,将其转换为十进制数值,忽略前导0
Number("1.1")//如果字符串中包含有效浮点格式,如“1.1”,将其转换为对应的浮点数字,忽略前导0
Number("0xf")//如果字符串中包含有效的十六进制格式,如“0xf”,将其转换为相同大小的十进制数值
Number("")//如果字符串为空,将其转换为0
//如果字符串中包含除上述格式之外的字符,则将其转换为NaN
parseInt(22.5) //22
parseInt("0xA")//10,字符串'0xA'被认为是十六进制数
parseInt("A", 16)//10,按16进制解析
parseFloat("3.14159e3")//3141.59,parseFloat() 所解析的字符串中第一个小数点是有效的
//parseFloat() 只解析十进制,因此它没有第二个参数指定基数的用法,而parseInt() 遇到小数点会停止解析,因为小数点并不是有效的数字字符。

Number

创建一个Number对象的构造函数。
如:let num=new Number(10);
常用方法
toString( ),返回数值对象的字符串表示。
如:num.toSting( ); num.toString(2);
toLocaleString( ),返回数值对象的字符串本地表示。
如:num=new Number(12356); num.toLocaleString( );
valueOf( ),返回数值对象的原始数值。
如:num.valueOf( );
toFixed(n),返回包含指定小数位数的数值字符串。
其中,n表示小数位数。
如:num.toFixed(2); num=new Number(10.005); num.toFixed(2);
toExponential(n),返回科学记数法表示的数值字符串。
其中,n表示结果中的小数的位数。
如:num=123;num.toExponential(1); num.toExponential(3);
toPrecision(n),返回数值最恰当的形式。
其中,n表示结果中数字的总位数(不包含指数)。
如:num=99;num.toExponential(1); num.toExponential(3);
本质上,它会根据数值和精度来确定调用toFixed( )还是toExponential( )。
为了正确的小数位精度表示数值,以上3个方法都会四舍五入。

Number.isFinite( )
ES6 在Number对象上,新提供了Number.isFinite()和Number.isNaN()两个方法。
Number.isFinite()用来检查一个数值是否为有限的(finite),即不是Infinity。
注意,如果参数类型不是数值,Number.isFinite一律返回false

Number.isFinite(15); // true
Number.isFinite(0.8); // true
Number.isFinite(NaN); // false
Number.isFinite(Infinity); // false
Number.isFinite(-Infinity); // false
Number.isFinite('foo'); // false
Number.isFinite('15'); // false
Number.isFinite(true); // false

Number.isNaN( )
Number.isNaN()用来检查一个值是否为NaN。
如果参数类型不是NaN,Number.isNaN一律返回false。

Number.isNaN(NaN) // true
Number.isNaN(15) // false
Number.isNaN('15') // false
Number.isNaN(true) // false
Number.isNaN(9/NaN) // true
Number.isNaN('true' / 0) // true
Number.isNaN('true' / 'true') // true

它们与传统的全局方法isFinite()和isNaN()的区别在于,传统方法先调用Number()将非数值的值转为数值,再进行判断,而这两个新方法只对数值有效,Number.isFinite()对于非数值一律返回false, Number.isNaN()只有对于NaN才返回true,非NaN一律返回false。
Number.parseInt( )与Number.parseFloat( )
ES6 将全局方法parseInt()和parseFloat(),移植到Number对象上面,行为完全保持不变。

// ES5的写法
parseInt('12.34') // 12
parseFloat('123.45#') // 123.45

// ES6的写法
Number.parseInt('12.34') // 12
Number.parseFloat('123.45#') // 123.45

Number.isInteger()
Number.isInteger()用来判断一个数值是否为整数。

Number.isInteger(25) // true
Number.isInteger(25.1) // false
Number.isInteger(25) // true
Number.isInteger(25.0) // true,JavaScript 内部,整数和浮点数采用的是同样的储存方法,所以 25 和 25.0 被视为同一个值
Number.isInteger() // false
Number.isInteger(null) // false
Number.isInteger('15') // false
Number.isInteger(true) // false

Number.EPSILON
ES6 在Number对象上面,新增一个极小的常量Number.EPSILON。根据规格,它表示 1 与大于 1 的最小浮点数之间的差。

JavaScript中采用64位存储浮点数,大于1的最小浮点数相当于二进制的1.00…001,其间有连续51个零。
这个值减去 1 之后,就等于 2 的 -52 次方。
实际上用该值来表示JavaScript的最小精度,从而在浮点数运算时用于确定误差范围。

Math对象

ES6 在 Math 对象上新增了 17 个与数学相关的方法。所有这些方法都是静态方法,只能在 Math 对象上调用。
常用方法
min( )与max( )
可以接收任意多个参数

let max, min;
  max = Math.max(3, 33, 13, 43);
  console.log(max);//43
  min = Math.min(3, 33, 13, 43);
  console.log(min);//3
  let nums = [1, 2, 3, 4, 5, 6];
  max = Math.max(...nums);
  console.log(max);//6

舍入方法
把小数值舍入为整数。
Math.ceil( ),始终向上舍入为最接近的整数。
Math.floor( ),始终向下舍入最接近的整数。
Math.round( ),执行四舍五入。
Math.fround( ),放回数值最接近的单精度(32位)浮点数表示

random( )
返回一个0~1之间的随机数,其中包含0但不包含1。
提示:Math.floor(Math.random( )*可选整数的总数+最小可能的整数),可从一个最小整数开始的一个范围内选择一个随机整数

Math.trunc( )
用于去除一个数的小数部分,返回整数部分。
对于非数值,其内部会先使用Number( )转换为数值再操作。
对于空值和无法截取整数的值,返回NaN。

Math.sign( )
用于判断一个数是正数、负数还是零。
对于非数值,先将其转换为数值在判断。
返回值
正数:+1;负数:-1;
0:0;-0:-0;
其他值:NaN。

Math.cbrt( )
用于计算一个数的立方根。
对于非数值,其内部会先使用Number( )转换为数值再操作。
对于空值和无法截取整数的值,返回NaN。

Math.hypot( )
用于计算所有参数的平方和的平方根。
如:Math.hypot(3, 4)->5


版权声明:本文为qq_45634651原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。