1. 程式人生 > 其它 >原生js之Symbol——讀Javascript高階程式設計①

原生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: