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.

今天的分享到這就告一段落咯,之後還會繼續更新,歡迎大家繼續關注.

參考:
菜鳥教程

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