ES6 - Symbol(符號)



Symbol(符號)簡介

ES6 引入了一種新的原始資料型別:Symbol。它們有助於在 JavaScript 程式中實現超程式設計。

語法

const mySymbol = Symbol()
const mySymbol = Symbol(stringDescription)

Symbol 只是可以儲存一些資料的記憶體塊。每個 Symbol 都指向不同的記憶體位置。Symbol() 建構函式返回的值是唯一且不可變的。

示例

讓我們透過一個例子來理解這一點。首先,我們建立了兩個沒有描述的符號,然後是具有相同描述的符號。在這兩種情況下,當比較符號時,相等運算子都將返回 false。

<script>
   const s1 = Symbol();
   const s2 = Symbol();
   console.log(typeof s1)
   console.log(s1===s2)
   const s3 = Symbol("hello");//description
   const s4 = Symbol("hello");
   console.log(s3)
   console.log(s4)
   console.log(s3==s4)
</script>

以上程式碼的輸出如下所示:

symbol
false
Symbol(hello)
Symbol(hello)
false
序號 屬性和描述
1 Symbol.for(key)

在符號登錄檔中搜索具有給定鍵的現有符號,如果找到則返回它。否則,將使用此鍵在全域性符號登錄檔中建立一個新的符號。

2 Symbol.keyFor(sym)

從全域性符號登錄檔中檢索給定符號的共享符號鍵。

Symbol 和類

Symbol 可與類一起使用來定義類中的屬性。其優點是,如果屬性是如下所示的 Symbol,則只有在知道 Symbol 名稱的情況下才能在包外訪問該屬性。因此,當使用 Symbol 作為屬性時,資料更加封裝。

示例

<script>
   const COLOR = Symbol()
   const MODEL = Symbol()
   const MAKE = Symbol()
   class Bike {
      constructor(color ,make,model){
      this[COLOR] = color;
      this[MAKE] = make;
      this[MODEL] = model;
   }
}
let bike = new Bike('red','honda','cbr')
console.log(bike)
//property can be accessed ony if symbol name is known
console.log(bike[COLOR])
</script>

以上程式碼的輸出如下所示:

Bike {Symbol(): "red", Symbol(): "honda", Symbol(): "cbr"}
red
廣告