前言

本章介紹數值的擴展。新增了很多方法,有些不常用的方法了解即可。
本章原文鏈接:數值的擴展

進制表示法

ES6 提供了二進制和八進制數值的新的寫法,分別用前綴0b(或0B)和0o(或0O)表示。
八進制就不再允許使用前綴0表示。
0b0o前綴的字符串數值轉為十進制,要使用Number方法。

console.log(Number(0b10));  // 二進制 2console.log(Number(0o10));  // 八進制 8

數值分隔符

ES2021,允許 JavaScript 的數值使用下劃線(_)作為分隔符。
數值分隔符主要為了書寫數值時增加數值的可讀性,不是為了處理外部輸入的數據,對于 JavaScript 內部數值的存儲和輸出,并沒有影響。

注意:

  • 不能放在數值的最前面(leading)或最后面(trailing)。
  • 不能兩個或兩個以上的分隔符連在一起。
  • 小數點的前后不能有分隔符。
  • 科學計數法里面,表示指數的eE前后不能有分隔符。
  • 分隔符不能緊緊跟著進制的前綴
  • 字符串轉數值的一些操作方法不支持數值分隔符

其它進制也能使用數值分隔符

const sample10 = 1000_1000_1000;const sample2 = 0b1000_1000;const sample8 = 0o1000_1000;console.log(sample10);  // 十進制  100010001000console.log(sample2);  // 二進制  136console.log(sample8);  // 八進制  2097664

注意:Number()、parseInt()、parseFloat()不支持數字分隔符

數值的方法

Number.isFinite(), Number.isNaN()

ES6 在Number對象上,新提供了Number.isFinite()Number.isNaN()兩個方法。

  • Number.isFinite()用來檢查一個數值是否為有限的數字(finite),即不是Infinity
  • Number.isNaN()用來檢查一個數值是否為NaN。

注意:
兩個新方法與之前全局方法isFiniteisNaN有什么不同呢?

  • 而這兩個新方法只對數值有效,
  • 傳統方法先調用Number()將非數值的值轉為數值,再進行判斷,
isFinite(25) // trueisFinite("25") // trueNumber.isFinite(25) // trueNumber.isFinite("25") // falseNumber.isFinite(Infinity); // falseNumber.isFinite(-Infinity); // falseisNaN(NaN) // trueisNaN("NaN") // trueNumber.isNaN(NaN) // trueNumber.isNaN("NaN") // false

Number.parseInt(), Number.parseFloat()

ES6 將全局方法parseInt()parseFloat(),移植到Number對象上面,行為完全保持不變。主要是用于全局變量的模塊化

  • parseInt() 函數解析字符串并返回整數。
  • parseFloat() 函數解析字符串并返回浮點數。
// ES5的全局方法const sampleInt = parseInt(11.11);const sampleFloat = parseFloat(1a2b3c);// ES6的Number方法const sampleInt1 = Number.parseInt(11.11);const sampleFloat1 = Number.parseFloat(1a2b3c);console.log(sampleInt, sampleFloat);  // 11, 1console.log(sampleInt1, sampleFloat1);  // 11, 1

Number.isInteger()

Number.isInteger()方法用來判斷給定的參數是否為整數。

注意:

  • 由于整數和浮點數采用的是同樣的儲存方法,所以 4 和 4.0 被視為同一個值。都為整數
  • 參數需要為數值,參數不是數值,Number.isInteger()直接返回false
  • 由于 JavaScript 數值精度最多可以達到 53 個二進制位,如果數值的精度超過這個限度,第54位及后面的位就會被丟棄,會導致Number.isInteger可能會誤判。絕對值也是如此。
const sample1 = Number.isInteger(44);const sample2 = Number.isInteger(44.00); // 相當于 44 const sample3 = Number.isInteger(44);  // 非數值直接返回falseconst sample4 = Number.isInteger(44.0000000000000000987654321); // 誤判為trueconsole.log(sample1, sample2, sample3, sample4);  // true, true, false, true

數值新增常量

Number.EPSILON

ES6 在Number對象上面,新增一個極小的常量Number.EPSILON。它表示 1 與大于 1 的最小浮點數之間的差。
對于 64 位浮點數來說,大于 1 的最小浮點數相當于二進制的1.00..001(小數點后面有連續 51 個零),這個值減去 1 之后,就等于 2 的 -52 次方。
Number.EPSILON 實際上是 JavaScript 能夠表示的最小精度。
Number.EPSILON 實質是一個可以接受的最小誤差范圍。

const sample = Number.EPSILON === Math.pow(2, -52);console.log(sample); // const sample1 = Number.EPSILON;console.log(sample1); // const sample2 = Number.EPSILON.toFixed(20);console.log(sample2); // 

安全整數和 Number.isSafeInteger()

JavaScript 能夠準確表示的整數范圍在-2^53到2^53之間(不含兩個端點),超過這個范圍,無法精確表示這個值。
ES6 引入了Number.MAX_SAFE_INTEGERNumber.MIN_SAFE_INTEGER這兩個常量,用來表示-2^53到2^53上下限。

const sample = Number.MAX_SAFE_INTEGER === 9007199254740991;const sample1 = Number.MIN_SAFE_INTEGER === -Number.MAX_SAFE_INTEGER;const sample2 = Number.MIN_SAFE_INTEGER === -9007199254740991;console.log(sample,sample1,sample2);

Number.isSafeInteger()用來判斷一個整數是否落在這個范圍之內,對于非整數,全部返回false
?

const sample = Number.isSafeInteger(44);   // 整數const sample1 =Number.isSafeInteger(44.001);  // 非整數const sample3 =Number.isSafeInteger(9007199254740990);const sample3 =Number.isSafeInteger(9007199254740992);console.log(sample,sample1,sample2,sample3); // true, false, true, false

Math 對象的擴展

ES6 在 Math 對象上新增了 17 個與數學相關的方法。
所有這些方法都是靜態方法,只能在 Math 對象上調用。

  1. Math.trunc() - 取整。
  2. Math.sign() - 判斷數字是正數、負數、還是零。
  3. Math.cbrt() - 計算一個數的立方根
  4. Math.clz32() - 計算一個數的 32 位二進制形式的前導 0 的個數 。
  5. Math.imul() - 計算兩個參數的類 C 32 位乘法的。
  6. Math.fround() - 返回一個數的32位單精度浮點數形式。
  7. Math.hypot() - 返回所有參數的平方和的平方根。
  8. Math.expm1() - 返回 ex - 1,x為參數
  9. Math.log1p() - 返回參數 + 1 后的自然對數
  10. Math.log10() - 返回以 10 為底的參數對數
  11. Math.log2() - 返回以 2 為底的參數對數
  12. Math.sinh() - 函數返回一個數字(單位為角度)的雙曲正弦值。
  13. Math.cosh() - 函數返回數值的雙曲余弦函數。
  14. Math.tanh() - 函數將會返回一個數的雙曲正切函數值。
  15. Math.asinh() - 函數返回給定數字的反雙曲正弦值。
  16. Math.acosh() - 返回一個數字的反雙曲余弦值。
  17. Math.atanh() - 函數返回一個數值反雙曲正切值。

Math.trunc()

Math.trunc() 方法會將數字的小數部分去掉,只保留整數部分,是一個取整操作。
Math 中有三個方法: Math.floor()Math.ceil()Math.round(),也是用于取整操作。

  • Math.floor()向下取整;
  • Math.ceil()向上取整;
  • Math.round()進行四舍五入操作。
  • Math.trunc()去除小數部分,只保留整數部分。
const sample = Math.trunc(4.9); // 去掉小數位保留整數位const sample1 = Math.trunc(4.4);  // 其它數據類型先調用Number轉化為數值類型const sample2 = Math.trunc(12.a); // 不能正確轉化為數值類型返回NaNconsole.log(sample, sample1,sample2); // 4, 4 ,NaN

Math.sign()

Math.sign()判斷一個數到底是正數、負數、還是零。對于非數值,會先將其轉換為數值。
5種返回值, 分別是 1, -1, 0, -0, NaN. 代表的各是正數, 負數, 正零, 負零, NaN

  • 參數為正數,返回+1
  • 參數為負數,返回-1
  • 參數為 0,返回0
  • 參數為-0,返回-0;
  • 其他值,返回NaN
const sample = Math.sign(-4);  // -1 負數const sample1 = Math.sign(4);  // 1 正數const sample2 = Math.sign(0);  // 0 0const sample3 = Math.sign(-0);  // -0 -0const sample4 = Math.sign(a);  // NaN  非數值console.log(sample, sample1, sample2, sample3, sample4); // -1, 1, 0, -0, NaN

Math.cbrt()

在數學上 : 如果x3=a,那么x叫做a的立方根。
Math.cbrt()計算一個數的立方根

const sample = Math.cbrt(-1);const sample1 = Math.cbrt(8);const sample2 = Math.cbrt(0);  // 0的立方根是0const sample3 = Math.cbrt(-0);const sample4 = Math.cbrt(a);  // 非數值類型先調用Number轉化為數值類型console.log(sample, sample1, sample2, sample3, sample4); // -1, 2, 0, -0, NaN

Math.clz32()

Math.clz32()函數返回參數轉化為 32 位無符號整數數字二進制 開頭的 0 的個數,
對于空值或其他類型的值,Math.clz32方法會將它們先轉為數值,然后再計算。

注意

  • Math.clz32()對于小數,只考慮整數部分
  • << 運算符把 【要位移的數字】 的所有位向左移 【位移位數】 指定的位數。
  • result =【要位移的數字】 << 【位移位數】
const sample = Math.clz32();  // 空轉化為數值為 0 const sample1 = Math.clz32(1 << 29);  // 左位移運算符改變const sample2 = Math.clz32(44.7); // 只考慮整數部分const sample3 = Math.clz32(true);  // 轉化為數值為 1 const sample4 = Math.clz32(a);  // 非數值類型先調用Number轉化為數值類型console.log(sample, sample1, sample2, sample3, sample4); // 32, 2, 26, 31, 32

Math.imul()

Math.imul()方法將兩個參數分別轉換為 32 位整數,相乘后返回 32 位的帶符號整數。
JavaScript 有精度限制,使得超過 2 的 53 次方的值無法精確表示。Math.imul()方法可以返回正確的低位數值。

const sample = Math.imul(-1, 8.9);  // 參數有小數會先轉化為整數const sample1 = Math.imul(0xffffffff, 5); //  下面的參數它們的乘積超過了 2 的 53 次方也能正確顯示const sample2 = Math.imul(0x7fffffff, 0x7fffffff); console.log(sample, sample1, sample2); // -8, -5, 1

Math.fround()

Math.fround() 可以將任意的數字轉換為32位單精度浮點數形式。
JavaScript 內部使用64位的雙浮點數字,支持很高的精度。對于32位單精度格式來說,數值精度是24個二進制位(1 位隱藏位與 23 位有效位)

注意

  • 如果參數的絕對值大于224,返回的結果便開始丟失精度。
  • 對于 NaNInfinity,此方法返回原值
  • 對于其它非數值,Math.fround 方法先將其轉為數值,再返回單精度浮點數。
const sample = Math.fround(99); const sample1 = Math.fround(0.7); // 丟失精度const sample2 = Math.fround(5);const sample3 = Math.fround(Infinity);console.log(sample, sample1, sample2, sample3); // 輸出 99, 0.699999988079071, 5, Infinity

Math.hypot()

Math.hypot()函數返回所有參數的平方和的平方根。

const sample = Math.hypot(3, 4); // 2*2 + 2*2 的平方根const sample1 = Math.hypot(); // 0 空轉化為數值為 0 const sample2 = Math.hypot(-9);const sample3 = Math.hypot(Infinity);  // 非數值類型先轉化為數值類型const sample4 = Math.hypot(1, 2, a); // 只要有一個參數無法轉為數值,就會返回 NaN。console.log(sample, sample1, sample2, sample3, sample4); // 5, 0, 9, Infinity, NaN 

對數方法

Math.expm1()

Math.expm1()返回 e**x** - 1,即Math.exp(x) - 1其中 x 是該函數的參數, e 是自然對數的底數

const sample = Math.expm1(-38);const sample1 = Math.expm1(0);const sample2 = Math.expm1(1);const sample3 = Math.expm1(a);console.log(sample, sample1, sample2, sample3); // -1, 0, 1.718281828459045, NaN

Math.log1p()

Math.log1p()方法返回參數 + 1 后的自然對數,(底為 e),即Math.log(1 + x)

const sample = Math.log1p(-2); // 參數小于 -1 返回 NaNconst sample1 = Math.log1p(-1); // -1 + 1 = 0 返回 - Infinity 0沒有對數const sample2 = Math.log1p(0); // 0 + 1 = 1 1 的對數是 0const sample3 = Math.log1p(a);console.log(sample, sample1, sample2, sample3); // NaN, -Infinity, 0, NaN

Math.log10()

Math.log10()返回以 10 為底的參數對數

const sample = Math.log10(-2); // 參數小于 0 返回 NaNconst sample1 = Math.log10(1); // 1 的對數是 0const sample2 = Math.log10(10); // 轉化為數值類型const sample3 = Math.log10(a);console.log(sample, sample1, sample2, sample3); // NaN, 0, 1, NaN

Math.log2()

Math.log10()Math.log2() 類似,一個以 10 為底,一個以 2 為底
Math.log2() 返回以 2 為底的參數對數

const sample = Math.log2(-2); // 參數小于 0 返回 NaNconst sample1 = Math.log2(1); // 1 的對數是 0const sample2 = Math.log2(1024); // 轉化為數值類型const sample3 = Math.log2(a);console.log(sample, sample1, sample2, sample3); // NaN, 0, 10, NaN

雙曲函數方法

ES6 新增了 6 個雙曲函數方法。

  1. Math.sinh() 函數返回一個數字(單位為角度)的雙曲正弦值。
  2. Math.cosh() 函數返回數值的雙曲余弦函數, 可用constant e表示。
  3. Math.tanh() 函數將會返回一個數的雙曲正切函數值。
  4. Math.asinh() 函數返回給定數字的反雙曲正弦值。
  5. Math.acosh() 返回一個數字的反雙曲余弦值。
  6. Math.atanh() 函數返回一個數值反雙曲正切值。

BigInt 數據類型

描述

ES2020 引入了一種新的數據類型 BigInt,這是 ECMAScript 的第八種數據類型。
BigInt 只用來表示整數,沒有位數的限制,任何位數的整數都可以精確表示。
BigInt 數據類型的目的是比Number數據類型支持的范圍更大的整數值。

注意

  • BigInt 也可以使用各種進制表示,都要加上后綴 n
  • BigIntNumber 數值的類型不同。
  • BigInt 除一元加號(+)運算符外,BigInt 可以使用所有運算符。
  • BigInt 也可以轉化為其它數據類型。
  • BigInt 不能與普通數值進行混合運算。
const sample = 99999999999999999999n; // 可以表示任意長度的整數const sample1 = 999n + 999n * 99n / 99n - 99n; // 可以使用除一元加號外所有運算符const sample2 = 0o777n + 0b1101n;  // 可以使用各種進制來表示const sample3 = String(1n); // 轉化為其他類型數據 n會消失console.log(sample); // 99999999999999999999nconsole.log(sample1); // 1899nconsole.log(sample2); // 524nconsole.log(sample3); // 1const sample4 = 10n + 10; // 直接報錯 不能與普通數值進行混合運算。

BigInt 函數

JavaScript 原生提供 BigInt 函數,將其他類型的值轉為 BigInt 類型。 與 Number() 一致

注意

  • 參數不能為空。
  • 參數不能為小數。
  • 參數必須能正常轉化為數值。
const sample = BigInt(44);  const sample1 = BigInt(490);  // 可以正確轉換console.log(sample); // 44nconsole.log(sample1); // 490n// 下面全部報錯const sample2 = BigInt(undefined);const sample3 = BigInt(44a); // 轉化為數值為 NaNconst sample4 = BigInt(1.1); // 參數為小數報錯const sample5 = BigInt();  // 為空