備忘録的プログラミングリファレンス

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() で表示しようとしています。値はないためにエラーが出ます。

Symbol() 型の識別子
const EXAMPLE = Symbol();

console.log( EXAMPLE );		// Symbol() オブジェクトとして表示
alert( EXAMPLE );		// エラーになる(Uncaught TypeError: can't convert symbol to string)

 Symbol() には引数としてコメントを記憶しておくことができます。

Symbol() の引数
const EXAMPLE = Symbol( 'Symbol の例です' );
	

 Symbol 型に記憶されたコメントは .description プロパティで取得することができます。

Symbol() の引数
console.log( EXAMPLE.description );	// 'Symbol の例です'と表示される
	

 このコメントは変数の値としては利用できません。

 複数のシンボルを宣言できますが、すべて個別として扱われます。

複数の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型の変数名(識別子)は、その変数名を代入したり、他の変数名(識別子)やクラス名として使用することができません。

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 型の名称はオブジェクトのメソッドにも使用することができます。
 メソッド名は実行環境では見ることができません。メソッド名が隠蔽されます。

以下の確認ボタンをクリックして、開発用コンソールで実行結果を確認してみてください。

 メソッド名においても名称の重複の使用を防ぐことができます。