0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SymbolよりObjectの方が良い説

Posted at

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 {})に入れ替えよう!
  • 都合がよければWeakMapWeakSetを使おう!
0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?