Symbol() コンストラクター

Symbol() コンストラクターは symbol 型の値を返しますが、 "new Symbol()" という構文に対応しておらず、サブクラス化を意図していないため、コンストラクターとしては不完全です。 class 定義の extends 句の値として使用することもできますが、 super の呼び出しを行うと例外が発生します。

試してみましょう

構文

Symbol([description])

引数

description 省略可

文字列。デバッグには使用できるこのシンボルの説明ですが、シンボル自体にはアクセスできません。

シンボルの作成

新しいプリミティブであるシンボルを生成するには、解説にあるように Symbol() を任意の文字列とともに書きます。

js
let sym1 = Symbol();
let sym2 = Symbol("foo");
let sym3 = Symbol("foo");

上記のコードは 3 つの新しいシンボルを生成します。なお、 Symbol("foo")"foo" と言う文字列を強制的に記号にするわけではないことに注意してください。毎回新しいシンボルを生成します。

js
Symbol("foo") === Symbol("foo"); // false

new Symbol(...)

以下のように new 演算子を伴う構文では、 TypeError が発生します。

js
let sym = new Symbol(); // TypeError

このため、新しいシンボル値の代わりに明示的なシンボルラッパーオブジェクトを作成することができず、プリミティブなデータ型の周りに明示的なラッパーオブジェクトを作成することは一般的に可能です (例えば、 new Boolean, new String, new Number です)。

本当に Symbol のラッパーオブジェクトを生成したい場合は、 Object() 関数を使用することができます。

js
let sym = Symbol("foo");
let symObj = Object(sym);
typeof sym; // => "symbol"
typeof symObj; // => "object"

仕様書

Specification
ECMAScript Language Specification
# sec-symbol-constructor

ブラウザーの互換性

BCD tables only load in the browser

関連情報