ES6 数值 新特性

传统方式

    在介绍数值的扩展之前来看看旧的规范和使用方式,有对比才能看出不同之处.
在ES5中,存在一些全局函数如: isNaN()parseInt()parseFloat() 等. 但是大家有没有觉得把这类处理数值的函数归于window 对象有些不妥, 为了规范.在ES6中就把 parseInt() 这类数值相关的函数移植到了 Number 对象中.

移植前parseInt()函数使用方式 :

parseInt(2.5); // 2
//或者
window.parseInt(2.5); // 2

移植后 :

Number.parseInt(2.5); // 2

! ! ! 注意 : 使用之前必须得指定它是Number对象下的函数,否则会被默认为window下的函数。

当然不止移植就完事了,还是有区别的.
比如传统的 isNaN() 函数会把非数值的参数转化成数值再进行判断,而 Number. isNaN() 只对数值类型有效,非数值类型的参数一律返回 false。~上码:

isNaN("a"); // true 表示是一个数值

Number.isNaN("a"); // false 表示不是一个数值
Number

Number扩展


Number.parseInt 函数

parseInt 函数:将给定字符串转化为指定进制的整数,如果不指定默认 10 进制。parseInt 函数也是从 window 对象下移植到 Number 对象下,但是它的作用没有任何变化.

//指定进制
Number.parseInt("10",2);  // 2
//不指定进制(默认10进制)
Number.parseInt("10");   // 10
//数值也可以通过此方法来转换对应进制值
Number.parseInt(10,3);   // 3

Number.parseFloat 函数

parseFloat 函数:将给定字符串转化为浮点数。跟 parseInt 一样,被移植到 Number 对象下,作用保持不变。

Number.parseFloat("2.62") // 2.26
// 无法被解析成浮点数,则返回 NaN
Number.parseFloat("a")   // NaN

Number.isFinite 函数

Number.isFinite 函数:用来判断一个数值是否是有限的 , 和 isNaN() 类似 .

Number.isFinite(1));   // true
Number.isFinite(0.1); // true
// NaN 不是有限的
Number.isFinite(NaN); // false
Number.isFinite(Infinity);  // false
Number.isFinite(-Infinity); // false
// Number.isFinate 不会对字符串进行类型转换,所有非数值都返回 false
console.log( Number.isFinite('a')); // false
console.log( Number.isFinite('6'));  // false
console.log( Number.isFinite(true));  // false

                 为什么把这些函数移植到其他地方去呢?
      其实这么做的目的是慢慢地减少全局性的函数,把全局函数合理地规划到其他对象下,渐渐实现语言的模块化。

Number.isInteger 函数

Number.isInteger 函数用来判断是否是整数.

Number.isInteger(3.2); //false 非整数
Number.isInteger(3);   //true 整数
//试试奇葩的值
//大家看下面的值,严格意义上是一个小数,但是这里出现了误判.
Number.isInteger(1.0000000000000001) // true
// 数值的精度超过 53 个二进制位时,由于第 54 位及后面的位被丢弃,会产生误判
// 于是有了下面这函数

Number.isSafeInteger 函数安全整数

用于判断数值是否在安全范围内,那总得有个标准范围吧,于是来了个 安全整数 而 JavaScript 能够准确表示的整数范围在 -2^532^53之间,超过这个范围, 无法精确表示这个,则为不安全。
安全整数 分为 最大安全整数(Number.MAX_SAFE_INTEGER) 和 最小安全整数(Number.MIN_SAFE_INTEGER). 而Number.isSafeInteger 函数就是用来判断某个数值是否超出这个安全范围

Number.isSafeInteger(Number.MAX_SAFE_INTEGER);
// true 表示安全
Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 1);
// false 表示不安全,超出上限

Number.EPSILON 极小常量

Number.EPSILON 属性表示 1 与大于 1 的最小浮点数之间的差。那么这个数是多少呢,我们可以推下, 既然它是表示大于一的最小浮点数的差,计算机存储是采用二进制的方式,那这个值是1.00…001,小数点后面有连续 51 个零,在减去1后,就等于 2 的 -52 次方。

//看看它的值
console.log(Number.EPSILON);
// 2.220446049250313e-16
console.log(Number.EPSILON === Math.pow(2, -52));
// true
//注:
//Math.pow(底数,多少次方);计算一个值的多少次方.

Number.EPSILON 的出现是用来判断浮点数的计算误差,如果浮点数计算得到的误差不超过 Number.EPSILON 的值,就表示可以接受这样的误差。


Math 扩展

ES6 在 Math 对象上新增了 17 个数学相关的静态方法,这些方法只能在 Math 中调用.


我们先来看看计算相关的方法:

Math.cbrt(x)

用于计算一个数的立方根。
注意:
      会对非数值进行转换.
      非数值且无法转换为数值时返回 NaN.

Math.cbrt(3);  // 1.4422495703074083 也就是³√3

Math.imul(x,y)

用于计算两个参数以 32 位整数形式相乘的结果,大多数情况下可以与 x * y来使用,少数情况会出现误差.比如对于那些很大的数的乘法,低位数值往往都是不精确的,Math.imul方法可以返回正确的低位数值。

Math.imul(3, 8);  // 24
// 用于正确返回大数乘法结果中的低位数值
Math.imul(0x7fffffff, 0x7fffffff); // 1
//0x7fffffff表示32位红符号整数最大的值,然后一个最大的值的平方为何等于1呢?
//最大的值也就等于2^32-1嘛,在给个平方就等于2^64-2^33+1 , 2^46和2^33表示不了,就只能取最低位 ,也就是1

Math.hypot(…x)

用于计算所有参数的平方和的平方根。(可任意个参数)
注意:
      会对非数值进行转换.
      空值会被转换为 0.
      参数为 Infinity 或 -Infinity 返回 Infinity
      参数中存在无法转换为数值的参数时返回 NaN

Math.hypot(3, 4); // 5
//也就是 √3^2+4^2  => √25 => 5      公式 : √a^2+b^2+n^2....

Math.clz32(x)

用于返回数字的32 位无符号整数形式的前导0的个数。
注意:
      当参数为小数时,只考虑整数部分.
      对于空值或非数值,会转化为数值再进行计算

Math.clz32(0); // 32
Math.clz32(1); // 31
//前导0:表示数值前的0的填充.

Math.trunc(x)

用于去除一个数的小数部分,返回整数部分。非常好理解.
注意:
      整数部分为 0 时也会判断符号.
      会将非数值转为数值再进行处理.
      空值或无法转化为数值时时返回 NaN.

console.log(Math.trunc(6.66)); // 6
console.log(Math.trunc(99));   // 99

Math.fround(x)

用于返回 数值 的32位单精度浮点数形式。
注意:
      非数值类型时会将参数进行转换 .
      参数为 NaN 或 Infinity 时返回本身.(是NaN则返回NaN,).
      当小数的精度超过 24 个二进制位,会丢失精度.
      参数为 NaN 或 Infinity 时返回本身
      2 ^24取负至 2 ^24 次方之间的整数(不含两个端点),返回结果与参数本身一致

Math.fround(5);   // 5
Math.fround(1.234) // 1.125

Math.sign(x)

用来判断一个数到底是正数、负数、还是零。返回 1表示正数,-1表示负数,0表示0,-0表示-0.
注意:
      参数为 0 时,不同符号的返回不同.
      判断前会对非数值进行转换.
      判断前会对非数值进行转换.

Math.sign(-9); // -1
Math.sign(9); // 1
Math.sign(0); // 0
Math.sign(-0); // -0

Math.expm1(x)

用于计算 e的 x次方减 1 的结果,即 Math.exp(x) - 1 。
公式 : e^x-1
描述 : expm1 是 “exponent minus 1” 的缩写.
e 是自然对数的底数,是个无理数(无限不循环小数)  e=2.718281828459045
注意:
      会对非数值进行转换.
      参数不为数值且无法转换为数值时返回 NaN.

Math.expm1(1);  // 1.718281828459045
Math.expm1(0);  // 0
Math.expm1(-1); // -0.6321205588285577

Math.log1p(x)

用于计算x加1后的自然对数 ,即 Math.log(1 + x) 。
公式 :a=log2(x+1)
注意:
      参数小于 -1 时返回 NaN.
      参数等于-1时返回 -Infinity.

Math.log1p(1);  // 0.6931471805599453
Math.log1p(0);  // 0

Math.log10(x)

用于计算以 10 为底的 x 的对数。
公式 : a=log10(x) 或者 a=lg(x)
注意:
      会对非数值进行转换
      参数为0时返回 -Infinity
      参数小于0或参数不为数值(且无法转换为数值)时返回 NaN

Math.log10(9);   // 0.9542425094393249

Math.log2(x)

同理用于计算 2 为底的 x 的对数。
公式 : a=log2(x)
注意:
      与上雷同.

Math.log2(9);   // 3.169925001442312

其他函数:

Math.sinh(x) :用于计算双曲正弦。
Math.sinh(x): 用于计算双曲正弦。
Math.cosh(x): 用于计算双曲余弦。
Math.tanh(x): 用于计算双曲正切。
Math.asinh(x): 用于计算反双曲正弦。
Math.acosh(x): 用于计算反双曲余弦。
Math.atanh(x): 用于计算反双曲正切。
Math.PI : 圆周率 约等于 3.141592653589793
Math.SQRT1_2 : 1/2的平方根, 约等于 0.707
Math.SQRT2 : 2的平方根,约等于 1.414
Math.abs(x) : 返回x的绝对值.
Math.acos(x) :返回x的反余弦值.
Math.toSource() : 返回字符串 “Math”.
Math.tan(x) : 返回x的正切值.
Math.sin(x) : 返回正弦值.
Math.random() : 返回0到1之间的伪随机数.
Math.min([x[,y[,…]]]) : 返回0个到多个数值中最小值.
Math.max([x[,y[,…]]]) : 返回0个到多个数值中最大值.

还提供了指数运算,指数运算符 **

即 Math.pow(x, y);

console.log(2 ** 2);  // 4
Math.pow(2, 2)    //4

console.log(2 ** 2 ** 3); // 256```
let num = 3;
num **= 2;
console.log(num); // 9
   

可以看到如此之多数学方法,非常的难记,根本记不了这么多,我觉得知道ES6为Math对象扩展了很多数学方法就可以了,等需要使用到的时候,再去查找资料就ok.

今天的分享到这就告一段落咯,之后还会继续更新,欢迎大家继续关注.

参考:
菜鸟教程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章