HTML5テクニカルノート
TypeScript: Symbol
- ID: FN1805002
- Technique: HTML5 / ECMAScript 2015
- Package: TypeScript 2.8
Symbol
は、不変で一意のデータ型です。オブジェクトのプロパティ名(識別子)として使われたりします。本稿は、公式Handbook「Symbols」にもとづき、解説とコード例を大きく改めました。
01 Symbolを使う
Symbol
はECMAScript 2015で備わりました。数値や文字列と同じく、プリミティブなデータ型です。使うときは、tsconfig.jsonのcompilerOptionsでtargetをes6にしてください。
tsconfig.json{ "compilerOptions": { "target": "es6", } }
オブジェクトはSymbol()
関数を呼び出してつくります。引数には、文字列が渡せます。数値や文字列と異なり、コンストラクタからつくることはできません。
let symbol1 = Symbol(); let symbol2 = Symbol('key'); // let symbol3 = new Symbol(); // コンパイルエラー
Symbol
オブジェクトは、不変で一意のデータ型です。引数に同じ値を渡しても、異なるインスタンスとして扱われます。引数の文字列はデバッグで使うためのSymbol
オブジェクトの説明です。
let symbol3 = Symbol('key'); console.log(symbol2 === symbol3); // false
Symbol
は、オブジェクトのプロパティ名(識別子)として使えます。プロパティ名を与えるときや、オブジェクトから参照する場合には[]
演算子を用いてください。オブジェクトの識別子を[]
で参照した変数により定めるのは、ECMAScript 2015の「計算されたプロパティ名」の構文です。
const id = Symbol(); let object = { [id]: 'value' }; console.log(object[id]); // value
Symbol
は、オブジェクトのプロパティのほか、クラスメンバにも用いられます。
const getDayJp = Symbol(); class Today { [getDayJp]() { const today = new Date(); return today.getFullYear() + '年' + (today.getMonth() + 1) + '月' + today.getDate() + '日'; } } const today = new Today(); console.log(today[getDayJp]()); // 2018年5月5日
02 周知のSymbol
Symbol()
関数でつくるオブジェクトに加えて、ECMAScript 5以前では開発者に公開されていなかった言語内部のふるまいを表すビルトインのSymbol
があります。これらは周知の(well-known)Symbol
と呼ばれ、静的なメンバとして備わっています。
02-01 イテレーション
Symbol.iterator
オブジェクトのデフォルトのイテレータを返すメソッドです。for...of
文で用いられます(「Symbol.iterator」参照)。
02-02 正規表現
Symbol.match
文字列の正規表現へのマッチを定めるメソッドです。String.prototype.match()
メソッドで用いられます(「Symbol.match」参照)。
Symbol.replace
文字列の正規表現にマッチした部分を置き換えるメソッドです。String.prototype.replace()
メソッドで用いられます(「Symbol.replace」参照)。
Symbol.search
文字列の正規表現にマッチする文字位置のインデックスを返すメソッドです。String.prototype.search()
メソッドで用いられます(「Symbol.search」参照)。
Symbol.split
文字列の正規表現にマッチするインデックスで文字列を分割するメソッドです。String.prototype.split()
メソッドで用いられます(「Symbol.split」参照)。
02-03 その他
Symbol.hasInstance
コンストラクタがオブジェクトをそのインスタンスと認めるかどうか決めるためのメソッドです。instanceof
演算子で用いられます(「Symbol.hasInstance」参照)。
Symbol.isConcatSpreadable
オブジェクトが配列要素にフラット化できるかを示すブール(論理)値です。Array.prototype.concat()
メソッドで用いられます(「Symbol.isConcatSpreadable」参照)。
Symbol.species
派生オブジェクトを生成するために使われるコンストラクタ関数です(「Symbol.species」参照)。
Symbol.toPrimitive
オブジェクトを対応するプリミティブ値に変換するメソッドです。抽象操作ToPrimitive
により用いられます(「Symbol.toPrimitive」参照)。
Symbol.toStringTag
オブジェクトの文字列表現をつくるときデフォルトで使われる文字列の値です。Object.prototype.toString()
メソッドで用いられます(「Symbol.toStringTag」参照)。
Symbol.unscopables
オブジェクト自身と継承するプロパティ名の指定により、その値をオブジェクトのwith
バインディング環境から外します(「Symbol.unscopables」参照)。
作成者: 野中文雄
作成日: 2018年5月5日
Copyright © 2001-2018 Fumio Nonaka. All rights reserved.