JavaScriptのSymbol
一意で不変の値を作成する
symbolは一意である
code:js
const sym1 = Symbol()
const sym2 = Symbol()
sym1 === sym1 // true
sym1 === sym2 // false
名前は指定してもしなくても良い
code:Js
const sym1 = Symbol()
const sym2 = Symbol('hoge')
.valueOf()したときの結果が変わる
code:js
sym1.valueOf() // Symbol()
sym2.valueOf() // Symbol(hoge)
意図を伝えて可読性を上げるぐらいの意味合いしかない
prototypes
.valueOf()
自分自身のsymbolを返す
code:Js
const sym2 = Symbol('hoge')
sym2.valueOf() // Symbol(hoge)
sym2 === sym2.valueOf() // true
.toString()
名前を返す
code:Js
const sym2 = Symbol('hoge')
sym2.toString() // Symbol(hoge)
sym2 === sym2.toString() // false (tsならtype error)
.for()
与えられた文字列をキーとして、グローバルレジストリ内でSymbolを検索する
このキーに対応するSymbolがすでに存在する場合、そのSymbolを返す
異なる場所や異なるスコープからでも、同じSymbolを参照することができるmrsekut.icon
存在しない場合は、新しいSymbolを作成し、それを返す
code:js
const sym1 = Symbol.for("共通キー");
const sym2 = Symbol.for("共通キー");
console.log(sym1 === sym2); // true
.keyFor()
.for()によって登録されたkeyを取得する
引数にSymbolを渡すとそのkeyを返す
引数のSymbolがグローバルレジストリに存在しない場合、undefinedを返す
code:js
const sym = Symbol.for("共通キー");
console.log(Symbol.keyFor(sym)); // "共通キー"
const localSym = Symbol("ローカルシンボル");
console.log(Symbol.keyFor(localSym)); // undefined
constを使ってSymbolのインスタンスを作るとこの型になる
letではならない
code:ts
const e = Symbol("e") // typeof e
let f = Symbol("f") // symbol
unique symbol型同士の変数は互いに代入不可