Symbol等について
SymbolというのはJavaScriptにおいて常に一意のシンボルを生成できるやつで、カプセル化等ができたり、弱い情報隠蔽ができるそうです。
Objectというのは、言うまでもないですかね...
様々なキー付きコレクションで複雑な状態を保存するやつです。
共通点
Symbolといえば常に一意のデータを取得できることですが、実はObjectも同じことができます。
Symbol() == Symbol() //false
({}) == ({}) //false
ということで立場が逆転しSymbolは不要になりました。
メリット
1. 文字数短縮
Symbol()
と書かずに({})
と書くだけで済みます。
2. 情報量を豊富にできる
Symbolは文字列のみしか持たせられないのに対し、Objectはなんでも保存できます。
例えばこのようにしたり。
const symboly_obj = {
type: "StateSymbol",
at: "script.js, Root"
};
なんならこの中にオブジェクトを入れられます(当たり前体操定期)
3. ガーベージコレクションが使える(激アツ)
Objectはプリミティブ型じゃなく、参照されない場合自動で消えます。(これをガーベージコレクションと言います。)
例えばシンボルとデータ(Map)があるとします。
const symbolMap: Map<symbol, object> = new Map;
symbolMap.set(Symbol(), {data: "aaa"});
こんな感じのデータ。
しかしSymbolは常に一意のデータを返すので渡しまくらないとこのマップの中身にアクセスできません。
万が一(じゃないかも)Symbolを無くした場合、何もしなければ永遠にゴミが残りますToT
まあkeys
を活用すれば消せないこともないけど面倒くさい...
そこでObject!!!!!
オブジェクトはWeakMapを使うことが出来ます!!!!
WeakMapはキーがオブジェクトのみで、そのオブジェクトがガーベージコレクションで消えたらそれに関連付けられたデータが一緒に消えます!!!!!
エコにデータを消せます!!!!!!!
いいね!!!!!
それにMapは取得の計算量がO(n)
なのに対しWeakMapはO(1)
で取得できます!!!!!!
デメリット
えー、WeakMap、WeakSetはキー・内容を列挙できません。
結論
- SymbolはObject(
({})
or{}
)に入れ替えよう! - 都合がよければ
WeakMap
・WeakSet
を使おう!