傳統方式
在介紹數值的擴展之前來看看舊的規範和使用方式,有對比才能看出不同之處.
在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.
今天的分享到這就告一段落咯,之後還會繼續更新,歡迎大家繼續關注.
參考:
菜鳥教程