看到這條條目錄有沒有感覺很枯燥,覺得自己的工作中還用不到它所以實在沒有耐心看下去,我也是最近得閑,逼自己靜下心來去學習去總結,只有在別人浮躁的時候你能靜下心來去學去看去總結,你才能進步。畢竟作為前端不斷學習掌握新技術才能跟得上瞬息萬變的潮流。
南方地區進入了梅雨季,最近一段時間天氣不太好不是下雨就是陰天,濕氣比較重。話說還真有點不習慣
別跑題了O(∩_∩)O哈哈~,開始搬磚^O^
JS中的數據類型有:字符串、數字、布爾、數組、對象、Null、Undefined
本篇是:數值的擴展
數值是js數據類型之一,是基本類型。
1.二進制和八進制表示法
個人覺得有必要先了解一下對應的英文,這里貼出來了,二進制:binary 八進制:octonary 十進制:decimal 十六進制:hexadecimal
ES6 提供了二進制和八進制數值的新的寫法,分別用前綴0b
(或0B
)和0o
(或0O
)表示。
1 0b111110111 === 503 // true 2 0o767 === 503 // true
從 ES5 開始,在嚴格模式之中,八進制就不再允許使用前綴0
表示,ES6 進一步明確,要使用前綴0o
表示。
如果要將0b
和0o
前綴的字符串數值轉為十進制,要使用Number
方法。
2.Number.isFinite()、Number.isNaN()
ES6 在Number
對象上,新提供了這兩個方法。
(1)Number.isFinite()
用來檢查一個數值是否為有限的(finite)。
Number.isFinite(0.8); // true Number.isFinite(NaN); // false Number.isFinite(Infinity); // false Number.isFinite(-Infinity); // false Number.isFinite('foo'); // false Number.isFinite('15'); // false Number.isFinite(true); // false
(2)Number.isNaN()
用來檢查一個值是否為NaN
。
Number.isNaN(NaN) // true Number.isNaN(9/NaN) // true Number.isNaN(15) // false Number.isNaN('15') // false Number.isNaN(true) // false Number.isNaN('true'/0) // true Number.isNaN('true'/'true') // true
3.Number.parseInt()、Number.parseFloat()
ES6 將全局方法parseInt()
和parseFloat()
,移植到Number
對象上面,行為完全保持不變。
逐步減少全局性方法,使得語言逐步模塊化。
// ES5的寫法 parseInt('12.34') // 12 parseFloat('123.45#') // 123.45 // ES6的寫法 Number.parseInt('12.34') // 12 Number.parseFloat('123.45#') // 123.45
4.Number.isInteger()
Number.isInteger()
用來判斷一個值是否為整數。需要注意的是,在 JavaScript 內部,整數和浮點數是同樣的儲存方法,所以3和3.0被視為同一個值。
Number.isInteger(25) // true Number.isInteger(25.0) // true Number.isInteger(25.1) // false
5.Number.EPAILON
ES6在Number對象上面,新增一個極小的常量Number.EPSILON
。
引入一個這么小的量的目的,在於為浮點數計算,設置一個誤差范圍。
console.log(0.1+0.2) // 0.30000000000000004 console.log(0.1+0.2-0.3) //5.551115123125783e-17
如果這個誤差能夠小於Number.EPSILON
,我們就可以認為得到了正確結果。
5.551115123125783e-17 < Number.EPSILON //true
因此,Number.EPSILON
的實質是一個可以接受的誤差范圍。
6.安全整數和Number.isSafeInteger()
JavaScript能夠准確表示的整數范圍在-2^53
到2^53
之間(不含兩個端點),超過這個范圍,無法精確表示這個值。
Math.pow(2, 53) // 9007199254740992 Math.pow(2, 53) === Math.pow(2, 53) + 1 //true
ES6引入了Number.MAX_SAFE_INTEGER
和Number.MIN_SAFE_INTEGER
這兩個常量,用來表示這個范圍的上下限。
Number.MAX_SAFE_INTEGER === Math.pow(2, 53) - 1 // true Number.MAX_SAFE_INTEGER === 9007199254740991 // true Number.MIN_SAFE_INTEGER === -Number.MAX_SAFE_INTEGER // true Number.MIN_SAFE_INTEGER === -9007199254740991 // true
實際使用這個函數時,需要注意。驗證運算結果是否落在安全整數的范圍內,不要只驗證運算結果,而要同時驗證參與運算的每個值。
Number.isSafeInteger(9007199254740993) // false Number.isSafeInteger(990) // true Number.isSafeInteger(9007199254740993 - 990) // true 9007199254740993 - 990 // 返回結果 9007199254740002 // 正確答案應該是 9007199254740003
9007199254740993
不是一個安全整數,但是Number.isSafeInteger
會返回結果,顯示計算結果是安全的。這是因為,這個數超出了精度范圍,導致在計算機內部,以9007199254740992
的形式儲存。
9007199254740993 === 9007199254740992 // true
親自驗證一下他輸出的結果,像是睜着眼睛說瞎話一樣,輸出的結果果然很直白,O(∩_∩)O哈哈~
7.Math對象的擴展(ES6在Math對象上新增了17個與數學相關的方法)
ES6在Math對象上新增了17個與數學相關的方法。所有這些方法都是靜態方法,只能在Math對象上調用。
此處列舉每個方法 但不一一舉例了 見諒
(1)Math.trunc() 用於去除一個數的小數部分,返回整數部分。
注意:
- a:對於非數值,
Math.trunc
內部使用Number
方法將其先轉為數值; - b:對於空值和無法截取整數的值,返回NaN。
(2)Math.sign()
用來判斷一個數到底是正數、負數、還是零。對於非數值,會先將其轉換為數值。
它會返回五種值。
- 參數為正數,返回+1;
- 參數為負數,返回-1;
- 參數為0,返回0;
- 參數為-0,返回-0;
- 其他值,返回NaN。
(3)Math.cbrt
方法用於計算一個數的立方根。
注意:
- 對於非數值,
Math.cbrt
方法內部也是先使用Number
方法將其轉為數值。
(4)Math.clz32
方法返回一個數的32位無符號整數形式有多少個前導0。
(5)Math.imul
方法返回兩個數以32位帶符號整數形式相乘的結果,返回的也是一個32位的帶符號整數。
(6)Math.fround方法返回一個數的單精度浮點數形式。
(7)Math.hypot
方法返回所有參數的平方和的平方根。
注意:
- 如果參數不是數值,
Math.hypot
方法會將其轉為數值。只要有一個參數無法轉為數值,就會返回NaN。
(8)對數方法,ES6新增了4個對數相關方法。
Math.expm1(x)
返回ex - 1,即Math.exp(x) - 1
。Math.log1p(x)
方法返回1 + x
的自然對數,即Math.log(1 + x)
。如果x
小於-1,返回NaN
。Math.log10(x)
返回以10為底的x
的對數。如果x
小於0,則返回NaN。Math.log2(x)
返回以2為底的x
的對數。如果x
小於0,則返回NaN。
(9)三角函數方法, ES6新增了6個三角函數方法
Math.sinh(x)
返回x
的雙曲正弦(hyperbolic sine)Math.cosh(x)
返回x
的雙曲余弦(hyperbolic cosine)Math.tanh(x)
返回x
的雙曲正切(hyperbolic tangent)Math.asinh(x)
返回x
的反雙曲正弦(inverse hyperbolic sine)Math.acosh(x)
返回x
的反雙曲余弦(inverse hyperbolic cosine)Math.atanh(x)
返回x
的反雙曲正切(inverse hyperbolic tangent)
.指數運算符
let a = 1.5; a **= 2; // 等同於 a = a * a; let b = 4; b **= 3; // 等同於 b = b * b * b;
指數運算符可以與等號結合,形成一個新的賦值運算符(**=
)。
Finaly,附參考文獻http://es6.ruanyifeng.com/#docs/number