Symbol() コンストラクター

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

構文

Symbol([description])

引数

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

シンボルの作成

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

let sym1 = Symbol()
let sym2 = Symbol('foo')
let sym3 = Symbol('foo')

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

Symbol('foo') === Symbol('foo')  // false

new Symbol(...)

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

let sym = new Symbol()  // TypeError

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

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

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

仕様書

仕様書
ECMAScript (ECMA-262)
Symbol constructor の定義

ブラウザーの互換性

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
Symbol() constructorChrome 完全対応 38Edge 完全対応 12Firefox 完全対応 36IE 未対応 なしOpera 完全対応 25Safari 完全対応 9WebView Android 完全対応 38Chrome Android 完全対応 38Firefox Android 完全対応 36Opera Android 完全対応 25Safari iOS 完全対応 9Samsung Internet Android 完全対応 3.0nodejs 完全対応 0.12

凡例

完全対応  
完全対応
未対応  
未対応

関連情報