Javascript 裡面定義的 primitive type 有六種,分別為string、number、boolean、 undefined、symbol、bigint
表示還不存在,這是 javascript 給所有變數的初始值,直到你給定變數一個值。跟 null 不同。null 是已經賦予一個值,只是那個值是是 null,就是變數沒有值的意思 當要把變數設定為空值,可以使用 null。
ES6 之後引入了 symbol,用來表示獨一無二的值。在 ES5,若要幫 object 添加新的 property,則只能使用 string,這時很容易產生衝突,而 symbol 可以解決這件事情,也就是說,object property name 現在可以有兩種型態 - 字串和 Symbol。
const s1 = Symbol();
typeof s1; // "symbol"
const s2 = Symbol();
s1 === s2; // false
Symbol() 是一個函數,不是 constructor,你不能 new 它:
const s = new Symbol(); // TypeError: Symbol is not a constructor
Symbol 函數也可以接受一個字串參數,來對該 Symbol 物件命名,主要是為了在 console 顯示,或轉型成字串時,方便區分不同的 Symbol
const s1 = Symbol('foo');
const s2 = Symbol('bar');
s1; // Symbol(foo)
s2; // Symbol(bar)
s1.toString(); // "Symbol(foo)"
s2.toString(); // "Symbol(bar)"
const s3 = Symbol('foo'); // 建立一個和 s1 同名的 s3
s1 === s3; // false 雖然同名,但 s1 和 s3 還是不一樣的值
const mySymbol = Symbol();
const a = {
[mySymbol]: 'Hello!'
};
a[mySymbol]; // Hello
因為因為 symbol 可以賦予獨一無二的值,也常常用來做 Enum。
number 在 javascript 裡面他的最大值為 2^53 - 1;
const max = Number.MAX_SAFE_INTEGER; // 9007199254740991
如果我們把他 + 1
const max = Number.MAX_SAFE_INTEGER + 1; // 9007199254740992
把他 + 2
const max = Number.MAX_SAFE_INTEGER + 2; // 9007199254740992, 錯誤產生了
這時候就可以透過 BigInt 來解決這件事情
BigInt(Number.MAX_SAFE_INTEGER) + 2n; //9_007_199_254_740_993n
typeof 123; // 'number'
typeof 123n; //'bigint'
42n === BigInt(42); // true
42n == 42; // true
1 + 1n // Error
BigInt(0.1) // Error 因為他不是整數