Symbol()
関数は、symbol 型の値を返します。これはビルトインオブジェクトを公開するための静的プロパティを持ち、グローバル symbol レジストリーを公開するための静的メソッドを持つので、ビルトインオブジェクトクラスのようにも見えますが、コンストラクタとしての機能を持たず、"new Symbol()
" はサポートされていません。
Symbol()
関数は常に一意の値を返します。symbol 値はオブジェクトのプロパティ識別子として使われます。symbol 型はこの目的のためだけに使われます。目的や使用方法の詳細を知りたい場合、 MDN用語集:Symbol を見てください。
symbol データ型は、プリミティブデータ型です。
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
構文
Symbol([description])
引数
description
Optional- 任意で文字列を渡すことができます。デバック用に使われますが、シンボル自体にはアクセスしないシンボルの説明です。
説明
新しいプリミティブ symbol を生成するために、説明のためのオプション文字列とともに Symbol()
を記述します。
var sym1 = Symbol(); var sym2 = Symbol("foo"); var sym3 = Symbol("foo");
上述のコードは、新しい symbol を 3 つ生成しています。Symbol("foo")
は、同一の symbol に文字列 "foo" を強制していません。毎回新しい symbol を生成しています。
Symbol("foo") === Symbol("foo"); // false
次の new
演算子を用いた構文は、TypeError
を生成するでしょう。
var sym = new Symbol(); // TypeError
これは、記述者が新しい symbol の値を生成する代わりに明示的な Symbol
ラッパーオブジェクトを生成することを防ぎます。プリミティブデータ型の周りに明示的なラッパーオブジェクトを生成することは、もはや ECMAScript6 ではサポートされていません。しかし、new Boolean
や new String
、new Number
のような既存のプリミティブラッパーオブジェクトは、歴史的な理由からまだ生成できます。
そして、もし本当に Symbol
ラッパーオブジェクトを生成したいなら、Object()
関数を使用できます。
var sym = Symbol("foo"); typeof sym; // "symbol" var symObj = Object(sym); typeof symObj; // "object"
グローバル symbol レジストリの共有 symbol
上述の Symbol()
関数を使用した構文は、あなたのコード全体で使用できるグローバル symbol は生成しません。ファイルを跨いでグローバルスコープのような環境で使用できる symbol を生成するには、グローバル symbol レジストリから symbol を扱うための Symbol.for()
と Symbol.keyFor()
メソッドを使用します。
オブジェクトの symbol プロパティを探す
Object.getOwnPropertySymbols()
メソッドは、symbol の配列を返し、与えられたオブジェクトの symbol プロパティを見つけられるようにしてくれます。すべてのオブジェクトは、symbol なしで初期化されます。そのため、オブジェクトに symbol プロパティを設定しないかぎり、この配列は空だということに注意してください。
プロパティ
Symbol.length
- 値が 0 の Length プロパティ
Symbol.prototype
Symbol
コンストラクターのためのプロトタイプを表します。
予約された symbol
ユーザーの symbol に加えて、JavaScript は ECMAScript5 以前では開発者に公開されていなかった言語内部のふるまいを表すビルトイン symbol を持っています。これらは下記のプロパティを使用することでアクセスできます。
反復用途の symbol
Symbol.iterator
- オブジェクトのための既定のイテレーターを返すメソッドです。
for...of
で使用されます。 Symbol.asyncIterator
- A method that returns the default AsyncIterator for an object.
for await of
で使用されます。
正規表現用途の symbol
Symbol.match
- 文字列にマッチするメソッドや、オブジェクトが正規表現として使用できるか決定するために使用されます。
String.prototype.match()
で使われます。 Symbol.replace
- マッチした文字列の部分を置き換えるメソッドです。
String.prototype.replace()
で使われます。 Symbol.search
- 正規表現にマッチする文字列内のインデックスを返すメソッドです。
String.prototype.search()
で使われます。 Symbol.split
- 正規表現にマッチするインデックスで文字列を分割するメソッドです。
String.prototype.split()
で使われます。
そのほかの symbol
Symbol.hasInstance
- コンストラクターオブジェクトがオブジェクトをそのインスタンスか確認するために使用するメソッドです。
instanceof
で使用されます。 Symbol.isConcatSpreadable
- オブジェクトが配列要素にフラット化できるかを示す真偽値です。
Array.prototype.concat()
で使用されます。 Symbol.unscopables
- プロパティの値を示す文字列の配列です。これらは関連するオブジェクトをバインドする
with
環境から除外されます。 Symbol.species
- 派生オブジェクトを生成するために使われるコンストラクター関数です。
Symbol.toPrimitive
- オブジェクトをプリミティブ値に変換する関数です。
Symbol.toStringTag
- オブジェクトの既定の説明のために使われる文字列値です。
Object.prototype.toString()
で使用されます。
メソッド
Symbol.for(key)
- 与えられた key で存在するシンボルを検索し、見つかればそれを返します。もしくは、グローバル symbol レジストリーにこの key で新しい symbol を生成します。
Symbol.keyFor(sym)
- グローバル symbol レジストリーから、与えられた symbol のための共有 symbol Key を取得します。
Symbol
プロトタイプ
すべての Symbol は、Symbol.prototype
を継承しています。
プロパティ
メソッド
例
symbol と一緒に typeof
演算子を使用する
typeof
演算子は、symbol を識別するために役立ちます。
typeof Symbol() === 'symbol' typeof Symbol('foo') === 'symbol' typeof Symbol.iterator === 'symbol'
Symbol 型変換
symbol の型変換作業を行うとき、いくつかの点に注意してください。
- symbol を number に変換しようとするとき,
TypeError
がスローされます(例:+sym
、sym | 0
)。 - 緩い等価演算子を使うとき、
Object(sym) == sym
はtrue
を返します。 Symbol("foo") + "bar"
はTypeError
( symbol を string に変換できません)をスローします。例えば、これは新しい string プロパティ名を暗黙的に生成することを防ぎます。- "安全な"
String(sym)
変換は symbol とともにSymbol.prototype.toString()
を呼び出したかのように動作しますが、new String(sym)
は TypeError をスローすることに注意してください。
Symbols と for...in
による反復
Symbol は for...in
よる反復からは取得できません。加えて、Object.getOwnPropertyNames()
は symbol オブジェクトプロパティを返しません、それらを取得するために Object.getOwnPropertySymbols()
を使うことができます。
var obj = {}; obj[Symbol("a")] = "a"; obj[Symbol.for("b")] = "b"; obj["c"] = "c"; obj.d = "d"; for (var i in obj) { console.log(i); // logs "c" and "d" }
Symbol と JSON.stringify()
JSON.stringify()
を使用するとき、Symbol をキーとしたプロパティは完全に無視されます。
JSON.stringify({[Symbol("foo")]: "foo"}); // '{}'
詳しくは JSON.stringify()
を見てください。
プロパティキーとしての Symbol ラッパーオブジェクト
プロパティキーとして symbol ラッパーオブジェクトを使うとき、このオブジェクトはラッパーされた symbol を強制されます。
var sym = Symbol("foo"); var obj = {[sym]: 1}; obj[sym]; // 1 obj[Object(sym)]; // still 1
仕様
仕様 | 状態 | コメント |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262) Symbol の定義 |
標準 | 初期定義 |
ブラウザー実装状況
デスクトップ | モバイル | サーバー | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Symbol | Chrome 完全対応 38 | Edge
完全対応
12
| Firefox 完全対応 36 | IE 未対応 なし | Opera 完全対応 25 | Safari 完全対応 9 | WebView Android 完全対応 38 | Chrome Android 完全対応 38 | Firefox Android 完全対応 36 | Opera Android 完全対応 25 | Safari iOS 完全対応 9 | Samsung Internet Android 完全対応 3.0 | nodejs 完全対応 あり |
asyncIterator | Chrome 完全対応 63 | Edge 未対応 なし | Firefox 完全対応 57 | IE 未対応 なし | Opera 完全対応 50 | Safari 完全対応 11.1 | WebView Android 完全対応 63 | Chrome Android 完全対応 63 | Firefox Android 未対応 なし | Opera Android 完全対応 46 | Safari iOS 未対応 なし | Samsung Internet Android 完全対応 8.0 | nodejs 完全対応 10.0.0 |
description | Chrome 完全対応 70 | Edge 未対応 なし | Firefox 完全対応 63 | IE 未対応 なし | Opera 完全対応 57 | Safari
完全対応
12.1
| WebView Android 完全対応 70 | Chrome Android 完全対応 70 | Firefox Android 完全対応 63 | Opera Android 完全対応 49 | Safari iOS
完全対応
12.2
| Samsung Internet Android 完全対応 10.0 | nodejs 完全対応 11.0.0 |
for | Chrome 完全対応 40 | Edge 完全対応 12 | Firefox 完全対応 36 | IE 未対応 なし | Opera 完全対応 あり | Safari 完全対応 9 | WebView Android 完全対応 40 | Chrome Android 完全対応 40 | Firefox Android 完全対応 36 | Opera Android 完全対応 あり | Safari iOS 完全対応 9 | Samsung Internet Android 完全対応 4.0 | nodejs 完全対応 あり |
hasInstance | Chrome 完全対応 50 | Edge 完全対応 15 | Firefox 完全対応 50 | IE 未対応 なし | Opera 完全対応 あり | Safari 完全対応 あり | WebView Android 完全対応 50 | Chrome Android 完全対応 50 | Firefox Android 完全対応 50 | Opera Android 完全対応 あり | Safari iOS 完全対応 あり | Samsung Internet Android 完全対応 5.0 | nodejs
完全対応
6.5.0
|
isConcatSpreadable | Chrome 完全対応 48 | Edge 完全対応 15 | Firefox 完全対応 48 | IE 未対応 なし | Opera 完全対応 あり | Safari 完全対応 あり | WebView Android 完全対応 48 | Chrome Android 完全対応 48 | Firefox Android 完全対応 48 | Opera Android 完全対応 あり | Safari iOS 完全対応 あり | Samsung Internet Android 完全対応 5.0 | nodejs 完全対応 6.0.0 |
iterator | Chrome 完全対応 43 | Edge 完全対応 12 | Firefox 完全対応 36 | IE 未対応 なし | Opera 完全対応 30 | Safari 完全対応 10 | WebView Android 完全対応 43 | Chrome Android 完全対応 43 | Firefox Android 完全対応 36 | Opera Android 完全対応 あり | Safari iOS 完全対応 10 | Samsung Internet Android 完全対応 4.0 | nodejs 完全対応 0.12 |
keyFor | Chrome 完全対応 40 | Edge 完全対応 12 | Firefox 完全対応 36 | IE 未対応 なし | Opera 完全対応 あり | Safari 完全対応 9 | WebView Android 完全対応 40 | Chrome Android 完全対応 40 | Firefox Android 完全対応 36 | Opera Android 完全対応 あり | Safari iOS 完全対応 9 | Samsung Internet Android 完全対応 4.0 | nodejs 完全対応 あり |
match | Chrome 完全対応 50 | Edge 未対応 なし | Firefox 完全対応 40 | IE 未対応 なし | Opera 完全対応 あり | Safari 完全対応 あり | WebView Android 完全対応 50 | Chrome Android 完全対応 50 | Firefox Android 完全対応 40 | Opera Android 完全対応 あり | Safari iOS 完全対応 あり | Samsung Internet Android 完全対応 5.0 | nodejs 完全対応 6.0.0 |
matchAll | Chrome 完全対応 73 | Edge 未対応 なし | Firefox 完全対応 67 | IE 未対応 なし | Opera 完全対応 60 | Safari 未対応 なし | WebView Android 完全対応 73 | Chrome Android 完全対応 73 | Firefox Android 完全対応 67 | Opera Android 完全対応 あり | Safari iOS 未対応 なし | Samsung Internet Android 未対応 なし | nodejs 完全対応 12.0.0 |
prototype | Chrome 完全対応 38 | Edge 完全対応 12 | Firefox 完全対応 36 | IE 未対応 なし | Opera 完全対応 25 | Safari 完全対応 9 | WebView Android 完全対応 38 | Chrome Android 完全対応 38 | Firefox Android 完全対応 36 | Opera Android 完全対応 25 | Safari iOS 完全対応 9 | Samsung Internet Android 完全対応 3.0 | nodejs 完全対応 あり |
replace | Chrome 完全対応 50 | Edge 未対応 なし | Firefox 完全対応 49 | IE 未対応 なし | Opera 完全対応 あり | Safari 完全対応 あり | WebView Android 完全対応 50 | Chrome Android 完全対応 50 | Firefox Android 完全対応 49 | Opera Android 完全対応 あり | Safari iOS 完全対応 あり | Samsung Internet Android 完全対応 5.0 | nodejs 完全対応 6.0.0 |
search | Chrome 完全対応 50 | Edge 未対応 なし | Firefox 完全対応 49 | IE 未対応 なし | Opera 完全対応 あり | Safari 完全対応 あり | WebView Android 完全対応 50 | Chrome Android 完全対応 50 | Firefox Android 完全対応 49 | Opera Android 完全対応 あり | Safari iOS 完全対応 あり | Samsung Internet Android 完全対応 5.0 | nodejs 完全対応 6.0.0 |
species | Chrome 完全対応 51 | Edge 完全対応 13 | Firefox 完全対応 41 | IE 未対応 なし | Opera 完全対応 38 | Safari 完全対応 10 | WebView Android 完全対応 51 | Chrome Android 完全対応 51 | Firefox Android 完全対応 41 | Opera Android 完全対応 41 | Safari iOS 完全対応 10 | Samsung Internet Android 完全対応 5.0 | nodejs
完全対応
6.5.0
|
split | Chrome 完全対応 50 | Edge 未対応 なし | Firefox 完全対応 49 | IE 未対応 なし | Opera 完全対応 あり | Safari 完全対応 あり | WebView Android 完全対応 50 | Chrome Android 完全対応 50 | Firefox Android 完全対応 49 | Opera Android 完全対応 あり | Safari iOS 完全対応 あり | Samsung Internet Android 完全対応 5.0 | nodejs 完全対応 6.0.0 |
toPrimitive | Chrome 完全対応 47 | Edge 完全対応 15 | Firefox 完全対応 44 | IE 未対応 なし | Opera 完全対応 あり | Safari 完全対応 あり | WebView Android 完全対応 47 | Chrome Android 完全対応 47 | Firefox Android 完全対応 44 | Opera Android 完全対応 あり | Safari iOS 完全対応 あり | Samsung Internet Android 完全対応 5.0 | nodejs 完全対応 6.0.0 |
toSource | Chrome 未対応 なし | Edge 未対応 なし | Firefox 完全対応 36 | IE 未対応 なし | Opera 未対応 なし | Safari 未対応 なし | WebView Android 未対応 なし | Chrome Android 未対応 なし | Firefox Android 完全対応 36 | Opera Android 未対応 なし | Safari iOS 未対応 なし | Samsung Internet Android 未対応 なし | nodejs 未対応 なし |
toString | Chrome 完全対応 38 | Edge 完全対応 12 | Firefox 完全対応 36 | IE 未対応 なし | Opera 完全対応 25 | Safari 完全対応 9 | WebView Android 完全対応 38 | Chrome Android 完全対応 38 | Firefox Android 完全対応 36 | Opera Android 完全対応 25 | Safari iOS 完全対応 9 | Samsung Internet Android 完全対応 3.0 | nodejs 完全対応 あり |
toStringTag | Chrome 完全対応 49 | Edge 完全対応 15 | Firefox 完全対応 51 | IE 未対応 なし | Opera 完全対応 あり | Safari 完全対応 あり | WebView Android 完全対応 49 | Chrome Android 完全対応 49 | Firefox Android 完全対応 51 | Opera Android 完全対応 あり | Safari iOS 完全対応 あり | Samsung Internet Android 完全対応 5.0 | nodejs
完全対応
6.0.0
|
unscopables | Chrome 完全対応 45 | Edge 完全対応 12 | Firefox 完全対応 48 | IE 未対応 なし | Opera 完全対応 あり | Safari 完全対応 9 | WebView Android 完全対応 45 | Chrome Android 完全対応 45 | Firefox Android 完全対応 48 | Opera Android 完全対応 あり | Safari iOS 完全対応 9 | Samsung Internet Android 完全対応 5.0 | nodejs 完全対応 0.12 |
valueOf | Chrome 完全対応 38 | Edge 完全対応 12 | Firefox 完全対応 36 | IE 未対応 なし | Opera 完全対応 25 | Safari 完全対応 9 | WebView Android 完全対応 38 | Chrome Android 完全対応 38 | Firefox Android 完全対応 36 | Opera Android 完全対応 25 | Safari iOS 完全対応 9 | Samsung Internet Android 完全対応 3.0 | nodejs 完全対応 あり |
@@toPrimitive | Chrome 完全対応 47 | Edge 完全対応 15 | Firefox 完全対応 44 | IE 未対応 なし | Opera 完全対応 34 | Safari ? | WebView Android 完全対応 47 | Chrome Android 完全対応 47 | Firefox Android 完全対応 44 | Opera Android 完全対応 34 | Safari iOS ? | Samsung Internet Android 完全対応 5.0 | nodejs ? |
凡例
- 完全対応
- 完全対応
- 未対応
- 未対応
- 実装状況不明
- 実装状況不明
- 非標準。ブラウザー間の互換性が低い可能性があります。
- 非標準。ブラウザー間の互換性が低い可能性があります。
- 実装ノートを参照してください。
- 実装ノートを参照してください。
- ユーザーが明示的にこの機能を有効にしなければなりません。
- ユーザーが明示的にこの機能を有効にしなければなりません。