JavaScriptのSymbol
一意で不変の値を作成する
ES2015で導入された
docs
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
#WIP
https://qiita.com/naruto/items/312adeb6145eb6221be7
unique symbol type
constを使ってSymbolのインスタンスを作るとこの型になる
letではならない
code:ts
const e = Symbol("e") // typeof e
let f = Symbol("f") // symbol
https://qiita.com/vvakame/items/3a1e628e53a5dd99dfe0
PR
unique symbol型同士の変数は互いに代入不可
https://www.pg-fl.jp/program/ts/kw-ref/symbol.htm
https://uncle-javascript.com/valid-typescript-chapter3
https://o296.com/2020/01/ts_unique.html