传统方式
在介绍数值的扩展之前来看看旧的规范和使用方式,有对比才能看出不同之处.
在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^53 到 2^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.
今天的分享到这就告一段落咯,之后还会继续更新,欢迎大家继续关注.
参考:
菜鸟教程