MDN’s new design is in Beta! A sneak peek: https://blog.mozilla.org/opendesign/mdns-new-design-beta/

これは Harmony(ECMAScript 6) 提案の一部であり、実験段階の技術です。
この技術の仕様は安定していません。ブラウザ互換性の一覧表を確認してください。またこれらの構文や動作は、仕様変更などにより、新しいバージョンのブラウザでは変更される可能性があるという点に注意してください。

symbolは、ユニークで不変なデータ型で、オブジェクトのプロパティ識別子として使われたりします。symbolオブジェクトは、Symbolプリミティブデータ型をラップした暗黙的なオブジェクトです。

構文

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
値が1のLengthプロパティ
Symbol.prototype
Symbolコンストラクターのためのプロトタイプを表す。

ウェルノウンsymbol

自分のSymbolに加えて、JavaScriptはECMAScript5とそれ以前では開発者に公開されていなかった言語内部のふるまいを表すビルトインsymbolを持っています。これらのはつぎのプロパティを使用することでアクセスできます。

イテレーションsymbol

Symbol.iterator
オブジェクトのための既定のイテレーターを返すメソッド。for...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
オブジェクトが配列要素にフラット化できるかを示すBoolean値。Array.prototype.concat()で使用される。
Symbol.unscopables
プロパティの値を示す文字列配列。これらは関連するオブジェクトをバインドするwith 環境から除外される。
Symbol.species
派生オブジェクトを生成するために使われるコンストラクター関数。
Symbol.toPrimitive
オブジェクトをプリミティブ値に変換する関数。
Symbol.toStringTag
オブジェクトの既定の説明のために使われる文字列値。Object.prototype.toString()で使用される。

メソッド

Symbol.for(key)
与えられたkeyで存在するシンボルを検索し、見つかればそれを返します。もしくは、グローバルsymbolレジストリにこのkeyで新しいsymboleを生成します。
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がスローされます(e.g. +sym or sym | 0)。
  • 緩い等価演算子を使うとき、Object(sym) == symtrueを返します。
  • Symbol("foo") + "bar" は、TypeError (symbolをstringに変換できません)をスローします。たとえば、これは新しいstringプロパティ名を暗黙的に生成することを防ぎます。
  • "安全な" String(sym)変換はsymbolとともにSymbol.prototype.toString()を呼び出したかのように動作しますが、あたらしいString(sym)をスローすることに注意してください。

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"
}

SymbolsとJSON.stringify()

JSON.stringify()を使用するとき、Symbol-keyedプロパティは完全に無視されます。

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)
The definition of 'Symbol' in that specification.
Standard Initial definition.

ブラウザ実装状況

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support 38 36.0 (36.0) 未サポート 25 未サポート
Symbol.iterator (@@iterator) 38 36.0 (36.0) 未サポート 25 未サポート
Symbol.unscopables (@@unscopables) 38 未サポート 未サポート 25 未サポート
Symbol.match (@@match) 未サポート 40.0 (40.0) 未サポート 未サポート 未サポート
Other well-known symbols 未サポート 未サポート 未サポート 未サポート 未サポート
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support 未サポート 38 36.0 (36.0) 未サポート 25 未サポート
Symbol.iterator (@@iterator) 未サポート 38 36.0 (36.0) 未サポート 25 未サポート
Symbol.unscopables (@@unscopables) 未サポート 38 未サポート 未サポート 25 未サポート
Symbol.match (@@match) 未サポート 未サポート 40.0 (40.0) 未サポート 未サポート 未サポート
Other well-known symbols 未サポート 未サポート 未サポート 未サポート 未サポート 未サポート

関連項目

ドキュメントのタグと貢献者

 このページの貢献者: YuichiNukiyama, hrysd
 最終更新者: YuichiNukiyama,