JavaScript 數值型別特性

以下先附上經典圖

number 型別

這就是我們常見的數值型別

let a = 100;
typeof a; // 'number'

Number 物件

Number 的物件,他是在 js run 起來就存在的物件被放在根物件底下window.Number

let num = new Number(100);
typeof num; // 'object'

可以看到 num print 出來是一個物件,想要取得 PrimitiveValue 裡的數值可以使用num.valueOf(),在這裏面的數值被創建出來後是不易更改的。

字串轉成數值

字串轉型成數值

let num = Number("100"); // 轉型成功
let num = Number("100abc"); // 轉失敗變成NaN(not a number)

也可以使用+觸發型別自動轉換

let num = +"100"; // 100
let num2 = +num; // 100

parseInt()函式

parseInt()可以轉換型別變成整數
只要他遇到看不懂的就會變成 NaN

parseInt("100"); // 100
parseInt("100 abc"); // 100
parseInt("100.00"); // 100
parseInt("100.00.00"); // NaN
parseInt("$100"); // NaN

parseInt()的第二個參數可以設定是幾進制轉換,預設是十進制

// 二進制
parseInt("1000", 2); // 8
// 八進制
parseInt("1000", 8); // 512
// 十六進制
parseInt("1000", 16); // 4096

注意

請勿使用以下寫法,parseInt()的第一個參數是放 String 型別,所以才有以下錯誤,因為當小數到達一定程度後,會自動轉成科學記號表示法,js 會把他轉成字串再進行 parse,導致了以下錯誤

parseInt(0.001); // 0

parseInt(0.0000001); // 1

// 演變過程
let num = 0.0000001; // 1e-8
(1e-8).toString(); // '1e-8'
parseInt("1e-8");

正確寫法

parseInt("0.0000001"); // 0

數值轉成字串

數值轉成字串可以使用 toString()函式,函式裡面參數可以設定進制的轉換

100.toString(); // 會報錯
(100).toString(); // '100'

// 2進制轉換
(100).toString(2); // '1100100'

// 怪異寫法可以work不推薦使用
100..toString(); // '100'

NaN

NaN,也就是 not a number

NaN 是數值型別,但是 NaN 不等於 NaN,跟 NaN 計算的數值結果都會變成 NaN。

typeof NaN; // 'number'

NaN == NaN; // false

NaN === NaN; // false

當要判斷是否是 NaN 時可以使用

let num = NaN;
Number.isNaN(num);
true;

整數運算特性

最大值和最小值

JavaScript 是採用浮點數運算系統(到一定位數會有精準度問題)

先來查看最大值和最小值,這裡的最小值是大於 0 的最小值哦

// 最大值
Number.MAX_VALUE; // 1.7976931348623157e+308
// 最小值
Number.MIN_VALUE; // 5e-324
Number.MIN_VALUE > 0; // true

可以使用 toString(2)轉換最大值來查看,可以發現整數在大於某一個數之後,就會變得沒那麼精準

Number.MAX_VALUE.toString(2);
// 輸出以下
// '1111111111111111111111111111111111111111111111111111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'

最大安全整數

再來介紹最大安全整數,可以發現使用最大值 toString(2)後有 1 的位數去做 parseInt 轉換會得到與最大安全整數相同的結果。

最大安全整數會等於2**53-1

Number.MAX_SAFE_INTEGER; // 9007199254740991

Number.MAX_SAFE_INTEGER == 2 ** 53 - 1; // true

parseInt("11111111111111111111111111111111111111111111111111111", 2); // 9007199254740991

在超過最大安全數後的計算會有誤差的問題,所以盡量不要這麼做

Number.MAX_SAFE_INTEGER + 1; // 9007199254740992

Number.MAX_SAFE_INTEGER + 2; // 9007199254740992

Number.MAX_SAFE_INTEGER + 3; // 9007199254740994

無限大數值 Infinity

Infinity 也是數值,也就是無限大數值,甚麼時候會跑出 Infinity 呢,來查看以下範例

Infinity - // 無限大
Infinity; // 負無限大

let num = 100 / 0; // Infinity

利用 Infinity 去做其他數值運算都會是 Infinity,除了使用 Infinity 和 Infinity 去做運算會變成 NaN。

let num = Infinity / 100; // Infinity

let num = Infinity + 100; // Infinity

let num = Infinity / Infinity; // NaN

無限大判斷,無限大會等於無限大

Number.POSITIVE_INFINITY == Infinity; // true

Number.NEGATIVE_INFINITY == -Infinity; // true

Infinity == Infinity; // true

BigInt

bigint 就是超大整數

那要如何使用呢? 只要在數值後面加上一個 n,bigint 只能跟 bigint 做計算,否則會出錯

let num = 123n;
typeof num; // 'bigint'

let num = num + 123; // Uncaught TypeError: Cannot mix BigInt and other types

let num = num + 123n; // 246n

浮點數計算

0.1 加上 0.2 不等於 0.3,是因為 javascript 使用Floating Point Math,導致無法整除,所以使用的時候要多加留意

0.1 + 0.2 == 0.3; // false
0.2 + 0.4 == 0.6; // false
0.3 + 0.6 == 0.9; // false
0.4 + 0.8 == 1.2; // false
console.log(0.1 + 0.2); // 0.30000000000000004

// Math.ceil() 函式會回傳大於等於所給數字的最小整數。
Math.ceil(0.1 * 0.2 * 100); // 3
Math.ceil(0.1 * 0.2 * 1000); // 21
Math.ceil(0.1 * 0.2 * 10000); // 201

(0.1).toString(2); // '0.0001100110011001100110011001100110011001100110011001101'
(0.2)
.toString(2)(
// '0.001100110011001100110011001100110011001100110011001101'

0.3
)
.toString(2); // '0.010011001100110011001100110011001100110011001100110011'

延伸