generated at
JavaScriptのSymbol
一意で不変の値を作成する
ES2015で導入された





symbolは一意である
js
const sym1 = Symbol() const sym2 = Symbol() sym1 === sym1 // true sym1 === sym2 // false



名前は指定してもしなくても良い
Js
const sym1 = Symbol() const sym2 = Symbol('hoge')
.valueOf() したときの結果が変わる
js
sym1.valueOf() // Symbol() sym2.valueOf() // Symbol(hoge)
意図を伝えて可読性を上げるぐらいの意味合いしかない


prototypes
.valueOf()
自分自身のsymbolを返す
Js
const sym2 = Symbol('hoge') sym2.valueOf() // Symbol(hoge) sym2 === sym2.valueOf() // true
.toString()
名前を返す
Js
const sym2 = Symbol('hoge') sym2.toString() // Symbol(hoge) sym2 === sym2.toString() // false (tsならtype error)
.for()
与えられた文字列をキーとして、グローバルレジストリ内でSymbolを検索する
このキーに対応するSymbolがすでに存在する場合、そのSymbolを返す
異なる場所や異なるスコープからでも、同じSymbolを参照することができるmrsekut
存在しない場合は、新しいSymbolを作成し、それを返す
js
const sym1 = Symbol.for("共通キー"); const sym2 = Symbol.for("共通キー"); console.log(sym1 === sym2); // true
.keyFor()
.for() によって登録されたkeyを取得する
引数にSymbolを渡すとそのkeyを返す
引数のSymbolがグローバルレジストリに存在しない場合、undefinedを返す
js
const sym = Symbol.for("共通キー"); console.log(Symbol.keyFor(sym)); // "共通キー" const localSym = Symbol("ローカルシンボル"); console.log(Symbol.keyFor(localSym)); // undefined














constを使ってSymbolのインスタンスを作るとこの型になる
letではならない
ts
const e = Symbol("e") // typeof e let f = Symbol("f") // symbol
unique symbol 型同士の変数は互いに代入不可