原生js之Symbol——讀Javascript高階程式設計①
Symbol()函式不能用做建構函式,與new關鍵字一起使用。這樣做是為了避免建立符號包裝物件,像使用Boolean、String、Number那樣,他們都支援建構函式且可用於初始化包含原始值的包裝物件:
使用全域性符號登錄檔
如果執行時的不同部分需要共享和重用符號例項,那麼可以用一個字串作為鍵,在全域性符號登錄檔中建立並重用符號。為此,需要使用Symbol.for()方法:
let hehe = Symbol.for('foo'); //建立新符號
let demo = Symbol.for('foo'); //重用已有符號
console.log(hehe===demo); //true
注意:即使採用相同的符號描述,在全域性登錄檔中定義的符號跟使用Symbol()定義的符號也並不等同:
let localSymbol = Symbol('foo');
let globalSymbol = Symbol.for('foo')
console.log(localSymbol === globalSymbol) //false
全域性登錄檔中的符號必須使用字串鍵來建立,因此作為引數傳給Symbol.for()的任何值都會被轉為字串。
還可以使用Symbol.keyFor()來查詢全域性登錄檔,這個方法接收符號,返回該全域性符號對應的字串鍵。如果查詢的不是全域性符號,則返回undefined.
// 建立全域性符號
let s = Symbol.for('foo');
console.log(Symbol.keyFor(s)); // foo
//建立普通符號
let s2 = Symbol('bar');
console.log(Symbol.keyFor(s2)) // undefined
注意:如果傳給Symbol.keyFor()的不是符號,則該方法丟擲TypeError: