JavaScriptのSymbol
一意で不変の値を作成する
symbolは一意である
jsconst sym1 = Symbol()
const sym2 = Symbol()
sym1 === sym1 // true
sym1 === sym2 // false
名前は指定してもしなくても良い
Jsconst sym1 = Symbol()
const sym2 = Symbol('hoge')
.valueOf()
したときの結果が変わる
jssym1.valueOf() // Symbol()
sym2.valueOf() // Symbol(hoge)
意図を伝えて可読性を上げるぐらいの意味合いしかない
prototypes
.valueOf()
自分自身のsymbolを返す
Jsconst sym2 = Symbol('hoge')
sym2.valueOf() // Symbol(hoge)
sym2 === sym2.valueOf() // true
.toString()
名前を返す
Jsconst sym2 = Symbol('hoge')
sym2.toString() // Symbol(hoge)
sym2 === sym2.toString() // false (tsならtype error)
.for()
与えられた文字列をキーとして、グローバルレジストリ内でSymbolを検索する
このキーに対応するSymbolがすでに存在する場合、そのSymbolを返す
異なる場所や異なるスコープからでも、同じSymbolを参照することができる

存在しない場合は、新しいSymbolを作成し、それを返す
jsconst sym1 = Symbol.for("共通キー");
const sym2 = Symbol.for("共通キー");
console.log(sym1 === sym2); // true
.keyFor()
.for()
によって登録されたkeyを取得する
引数にSymbolを渡すとそのkeyを返す
引数のSymbolがグローバルレジストリに存在しない場合、undefinedを返す
jsconst sym = Symbol.for("共通キー");
console.log(Symbol.keyFor(sym)); // "共通キー"
const localSym = Symbol("ローカルシンボル");
console.log(Symbol.keyFor(localSym)); // undefined
constを使ってSymbolのインスタンスを作るとこの型になる
letではならない
tsconst e = Symbol("e") // typeof e
let f = Symbol("f") // symbol
unique symbol
型同士の変数は互いに代入不可