ECMAScript 6 笔记(6)- 数值的扩展

原创 乘风逐月 随笔 ES6 120阅读 2018-08-24 17:11:04 举报

阅读原文: 阮一峰:ECMAScript 6 入门

一、二进制和八进制表示法

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

从ES5开始,在严格模式之中,八进制就不再允许使用前缀 0 表示,ES6 进一步明确,要使用前缀 0o 表示。

如果要将 0b 和 0o 前缀的字符串转为十进制,要使用 Number 方法。

二、Number.isFinite(),Number.isNaN()

ES6 在 Number 对象上新增了 Number.isFinite() 和 Number.isNaN() 两个方法。

(1) Number.isFinite()

Number.isFinite() 用来检查一个数值是否为有限的,既不是 Infinity 。该方法接收的参数如果不是数值,一律返回false。

(2) Number.NaN()

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

(3)与 isNaN()、isFinite() 的区别

Number.isNaN()、Number.isFinite() 方法与传统的全局方法 isFinite() 、isNaN() 的区别在于:传统方法先调用 Number() 将非数值的值转化为数值,再进行判断。而这两个新方法只对数值有效,Number.isFinite() 对于非数值一律返回 false,Number.isNaN() 只对 NaN 才返回 true,非 NaN 一律返回false。

三、Number.parseInt()、Number.parseFloat()

ES6 将全局方法 parseInt() 和 parseFloat(),移植到 Number 对象上,行为完全保持不变。这样做的目的是,逐步减少全局性方法,使得语言逐步模块化。

四、Number.isInteger()

Number.isIntger() 用来判断一个数值是否为整数。JavaScript 内部,整数和浮点数采用的是同样的存储方法,所以 25 和25.0 被视为同一个值。
如果参数不是数值,Number.isInteger() 返回false。

注:由于JavaScript采用IEEE754标准,数值存储为64位双精度格式,数值精度最多可以达到53个二进制,超过这个精度的数值,第54位及后面的位就会被丢掉,这种情况,Number.isIntger() 可能会误判。

类似的,如果一个数值的绝对值小于 Number.MIN_VALUE(5E-324),即小于JavaScript能够分辨的最小值,会被自动转为0,这时,Number.isInteger 也会误判。

如果对数据精度要求比较高,不建议使用 Number.isInteger 判断一个数值是否为整数。

五、Number.EPSILON

es6在 Number 对象上,新增了一个常量 Number.EPSILON,它表示1与大于1的最小浮点数之间的差。
Number.EPSILON 可以用来设置 "能够接受的误差范围"。如:误差范围设为2的-50次方(即 Number.EPSILON*Math.pow(2,2)),即如果两个浮点数的差小于这个值,我们就认为两个浮点数相等。
Number.EPSILON 实质上是一个可以接受的最小误差范围。

六、安全整数和 Number.isSafeInteger()

(1)安全整数

JavaScript 能够准确表示的整数范围在 -2^53 到 2^53 之间(不含两个端点),超过这个范围,无法准确表示这个值。

ES6 引入了 Number.MAX_SAFE_INTEGER 和 Number.MIN_SAFE_INTEGER 两个常量,用来表示这个范围的上下限。

(2)Number.isSafeInteger()

Number.isSafeInteger() 是用来判断一个整数是否落在这个范围之内。

但实际运算时,用使用这个方法直接验证运算结果是不准确的,因为超出极限的数值会以极限的最大最小值存储。所有运算时,要同时验证运算的参数和运算结果。

七、Math 对象的扩展

ES6在 Math 对象上新增了与数学相关的方法,新增方法都是静态方法只能在 Math 对象上调用。

(1)Math.trunc()

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

(2)Math.sign()

Math.sign() 方法用来判断一个数到底是正数、负数、还是零。对于非数值,会先将其转为数值。对于无法转为数值的值,返回NaN。返回的值有五种:
a. 参数为整数,返回+1;
b. 参数为负数,返回-1;
c. 参数为0,返回0;
d. 参数为-0,返回-0;
e. 其他值,返回NaN;

(3)Math.cbrt()

Math.cbrt() 方法用于计算一个数的立方根。对于非数值,Math.cbrt()方法内部也是先使用 Number() 方法,将其转化为数值。

(4)Math.clz32()

JavaScript 的整数使用 32 位二进制形式表示,Math.clz32() 方法返回一个数的32位无符号整数形式有多少个前导0。
对于小数,Math.clz32() 方法只考虑整数部分。
对于空值或其他类型的值,Math.clz32() 方法会先将它们转为数值,然后再计算。

(5)Math.imul()

Math.imul() 方法返回两个数以32位带符号整数形式相乘的结果,返回的也是一个32位的带符号整数。

如果只考虑最后32位,大多数情况下,Math.iuml(a,b)与 a*b 的结果是相同的,但是JavaScript对于超过2的53次方的值无法精确表示。
这就是说,对于很大数的乘法,低位数值往往是不精确的,Math.iuml() 方法可以返回正确的低位数值。

(6)Math.fround()

Math.fround() 方法返回一个数的32位单精度浮点数形式。
对于32位单精度格式来说,数值精度是24个二进制位(1位隐藏位于23位有效位),所以对于 -2的24次方 至 2的24次方之间的整数(不含两个端点),返回结果与参数本身一致。
如果参数的绝对值大于2的24次方,返回的结果便开始丢失精度。Math.fround() 方法的主要作用是,将64位双精度浮点数转为32位单精度浮点数。如果小数的精度超过24个二进制位,返回值就会不同于原值,否则返回值不变。
对于 NaN 和 Infinity,此方法返回原值。对于其他非数值类型的非数值,Math.fround()方法会先将其转为数值,再返回单精度浮点数。

(7)Math.hypot()

Math.hypot() 方法返回所有参数的平方和的平方根。如果参数不是数值,会将其先转为数值。只要有一个参数无法转为数值,就会返回NaN。

(8)指数运算符

ES6新增了指数运算符 ( )。指数运算符可以与等号结合,形成一个新的赋值运算符( = )。

注:在 V8 引擎中,指数运算符与 Math.pow() 的实现不相同,对于特别大的运算结果,两者会有细微差异。

评论 ( 1 )
最新评论