サイトトップ

Director Flash 書籍 業務内容 プロフィール

HTML5テクニカルノート

TypeScript: Symbol


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.