1.Symbol概述
Symbol建立的是一個獨一無二的值,沒有具體的表現形式,但是通過typeof看到他的資料類型為symbol。
Symbol函數可以接受參數,表示對于這個唯一值的描述。
每一個 Symbol 值都是不相等的,這意味着 Symbol 值可以作為辨別符,用于對象的屬性名,就能保證不會出現同名的屬性。這對于一個對象由多個子產品構成的情況非常有用,能防止某一個鍵被不小心改寫或覆寫。
let sy1 = Symbol('sy1');
let sy2 = Symbol('sy2');
console.log(sy1, sy2);//Symbol(sy1) Symbol(sy2)
console.log(sy1 == sy2);//false
// API
// .for會到全局系統資料庫中查找,是否有'sy3'這個key值,
// 如果有,将該key值對應的symbol值傳回,
// 如果沒有,建立一個symbol值
let sy3 = Symbol.for('hello');
let sy4 = Symbol.for('sy3');
console.log(sy3, sy4);//Symbol(hello) Symbol(sy3)
console.log(sy3 == sy4);//false
// .keyFor
let key = Symbol.keyFor(sy3);
console.log(key);//hello
// 應用 => 對象的屬性名
let obj = {
[sy2]: 'nihao'
}
obj[sy1] = 'hello world'
console.log(obj);//{ [Symbol(sy2)]: 'nihao', [Symbol(sy1)]: 'hello world' }
2.Symbol()與Symbol.for()都會生成新的Symbol。
差別:Symbol.for()會被登記在全局環境中供搜尋,而Symbol()不會。
Symbol.for()不會每次調用就傳回一個新的 Symbol 類型的值,而是會先檢查給定的key是否已經存在,如果不存在才會建立一個值。
Symbol.for()為 Symbol 值登記的名字,是全局環境的,不管有沒有在全局環境運作。
正如下圖所示,建立相同的Symbol,Symbol(‘hhh’)就不相同,因為Symbol()沒有登記機制,每次調用都會傳回一個不同的值
3.Symbol.keyFor()方法傳回一個已登記的 Symbol 類型值的key。
4.Symbol應用(消除魔術字元串)
Symbol 值可以作為辨別符,用于對象的屬性名,就可以應用到消除魔術字元串。
魔術字元串:在代碼中重複出現的同樣的字元串或數值。
消除魔術字元串:用變量來代替重複出現的值
存在魔術字元串的代碼塊:
這裡case條件中的值就是魔術字元串,因為case後面需要不斷出現判斷數值。當後期需要更改判斷條件的時候,需要一個個進行更改,這樣的寫法很不利于修改和維護。
function myFun (param) {
switch (param) {
case "1":
console.log(1);
break;
case "2":
console.log(2);
break;
case "3":
console.log(3);
break;
default:
console.log(0);
break;
}
}
myFun("1");
将上面case後面的數值用變量來代替,并且将每一個變量的值設為Symbol(),這樣不管attr1、attr2、attr3的值是什麼,Symbol()就保證了他們不會對彼此的值起沖突
消除魔術字元串的代碼塊:
let obj = {
attr1: Symbol(),
attr2: Symbol(),
attr3: Symbol(),
}
function myFun (param) {
switch (param) {
case obj.attr1:
console.log(1);
break;
case obj.attr2:
console.log(2);
break;
case obj.attr3:
console.log(3);
break;
default:
console.log(0);
break;
}
}
myFun(obj.attr1);