Symbol
Symbol は、 JavaScript に新たに加えれたプリミティブ型のクラスです。変数名(識別子)を一意のプロパティ名やメソッド名として使用することができます。
主にライブラリ開発者の利便性のためにあるようです。
const EXAMPLE = symbol(); let example_obj = {}; example_obj[EXAMPLE] = "a"; console.log( example_obj[EXAMPLE] );
プリミティブ型とは数値や文字列といった従来からある値とオブジェクト型とを区別するための概念です。null や undefined もプリミティブ型に入ります。
Symbol 型の値はデータとして使用することができません。しかし、変数名(識別子)はユーニークな名称として扱われます。オブジェクトのプロパティ名やメソッド名が重複しないようにしたり、外部からアクセスできないプロパティやメソッドとして使用できます。
Symbol は JavaScript の開発者の利便性のために設けられたようです。UI 開発では利用する機会はあまりないようです。
ページ内 Index
連想配列については以下の項目に分けて説明します。
構文( Syntax )
Symbol 型の値は以下のように宣言します。
const EXAMPLE = Symbol();
このように宣言することでプログラム上では変数名(識別子)がオブジェクトやクラスのプロパティ名やメソッド名に使用することができます。
以下の例は、Symbol を宣言した識別子をオブジェクトのプロパティ名として使用しています。
Symbol() として変数宣言をするとその変数名(識別子)自体が Symbol() というオブジェクトとであることに注意してください。
例えば、以下のように EXAMPLE の内容を出力しようとすると Symbol() オブジェクトであることが表示されます。
その下は EXAMPLE の値を alert() で表示しようとしています。値はないためにエラーが出ます。
const EXAMPLE = Symbol(); console.log( EXAMPLE ); // Symbol() オブジェクトとして表示 alert( EXAMPLE ); // エラーになる(Uncaught TypeError: can't convert symbol to string)
Symbol() には引数としてコメントを記憶しておくことができます。
const EXAMPLE = Symbol( 'Symbol の例です' );
Symbol 型に記憶されたコメントは .description プロパティで取得することができます。
console.log( EXAMPLE.description ); // 'Symbol の例です'と表示される
このコメントは変数の値としては利用できません。
複数のシンボルを宣言できますが、すべて個別として扱われます。
const SYMBOL_A = Symbol(); const SYMBOL_B = Symbol(); console.log( SYMBOL_A === SYMBOL_B ); // false }
シンボルを比較すると同じのものではないと出力されます。シンボルは個別として扱われていることが分かります。
Symbol 型は JavaScript のライブラリ開発者にとっては利便性が高い機能です。Symbol 型は識別子を一意にすることができ、重複することができません。
ユーザーがプロパティ名やメソッド名が被らないようにライブラリを使用することができます。
プロパティ(Property)
プロパティ | 概要 |
---|---|
.description | シンボルのコメントを取得 |
Symbol クラスには well-known symbols というプロパティが用意されています。詳しくは調べてみてください。
メソッド(Method)
JavaScript は実行までにコードコンパイルするー>コンパイルされたコードを実行するという段階を経ます。
以下はコンパイルから実行という段階を経る間に利用されるレジストリを利用するためのメソッドです。
メソッド | 概要 |
---|---|
.for() | レジストリーのシンボル値を返す |
.keyFor() | レジストリーからトークンの値を返す |
Symbol() 変数宣言の注意点
Symbol型の変数名(識別子)は、その変数名を代入したり、他の変数名(識別子)やクラス名として使用することができません。
const EXAMPLE = Symbol(); // Symbol を代入 let a = EXAMPLE; // Uncaught SyntaxError: redeclaration of let a // Symbol を変数名として再宣言し値を代入 let EXAMPLE = '123'; // Uncaught SyntaxError: redeclaration of const EXAMPLE // クラス名として使用 class EXAMPLE{ ... } // Uncaught SyntaxError: redeclaration of const EXAMPLE
代入しようとすると変数宣言できないエラーになります。
変数名やクラス名に使用しようとすると再宣言できないというエラーになります。
シンボルはオブジェクトやクラスのプロパティ名やメソッド名に使用することができます。
プロパティ名に使用
Symbol 型はオブジェクトのキーとして利用することができます。Symbol 型の名称をキーとして使用するには []
で囲みます。
プログラムコード上はキー名が分かりますが、実行すると Symbol() と表示されるだけでキー名が隠蔽されます。
もしも同じ Symbol による変数名(識別子)を使うとエラーとなるために名称の重複の使用を防ぐことができます。
メソッド名に使用
Symbol 型の名称はオブジェクトのメソッドにも使用することができます。
メソッド名は実行環境では見ることができません。メソッド名が隠蔽されます。
メソッド名においても名称の重複の使用を防ぐことができます。