ES6-シンボル

シンボル入門

ES6では、Symbolと呼ばれる新しいプリミティブ型が導入されています。これらは、JavaScriptプログラムにメタプログラミングを実装するのに役立ちます。

構文

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

シンボルは、データを格納できる単なるメモリです。各シンボルは、異なるメモリ位置を指します。Symbol()コンストラクターによって返される値は一意であり、不変です。

例を通してこれを理解しましょう。最初に、説明のない2つのシンボルを作成し、その後に同じ説明のあるシンボルを作成しました。どちらの場合も、シンボルが比較されると、等価演算子は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)

指定されたシンボルのグローバルシンボルレジストリから共有シンボルキーを取得します。

シンボルとクラス

シンボルをクラスで使用して、クラスのプロパティを定義できます。利点は、プロパティが以下に示すようにシンボルである場合、シンボル名がわかっている場合にのみ、パッケージの外部からプロパティにアクセスできることです。そのため、シンボルをプロパティとして使用すると、データはかなりカプセル化されます。

<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