NACの勉強の経過を綴るところ

個人的なコードの勉強

【JS】シンボルってなに?

JS逆引きレシピ本、017(P32)。

シンボル(Symbol)はシンボル(モノの名前)を表すための型です。文字列にも似ていますが、文字列ではありません。

意味がイマイチわからない。

let message = symbol('hoge');

上記は、変数messageの値が「hoge」になったわけではなく、messageの名前が「hoge」になった?
という理解で、合ってる……?


曖昧な理解のまま敢えて進めると、値ではなく名前を定義することで、その変数をユニークに定義することが出来る、ということだろうか。
以下のような場合、

let message = 'hoge';
let message2 = 'hoge';

console.log(message === message2);  // true

値が同じなので、当然比較すると等価となるのに対し、

let message = symbol('hoge');
let message2 = symbol('hoge');

console.log(message === message2);  // false

Symbolを使うと、たとえ同じ「hoge」という名前がついていても、それは別々のものなので等価とはならない。
クラスに同姓同名の山田太郎くんが二人いても、それは別人であるのと同じことか。


しかし、上記の理解が仮に合っているとして、使い道がわからない。
どういうときにSymbolを使うメリットがあるのか、理解できない。


いろいろ調べていたら、以下のようなページを見つけた。
ECMAScript6にシンボルができた理由 - Qiita
前半の説明は、やはり分かるような分からないような。
ただ、後半を読む限りでは、ぶっちゃけ現時点では理解する必要はないような気がする。

そんな訳で、ECMAScriptの仕様策定側にとってシンボルは非常に重要。だが逆に言えば、使うライブラリを自分達で決められ、自分達で書いたアプリを自分達でテストできる一般の開発者は、名前の衝突なんてどうとでも回避してきたわけで、今更シンボルが使えてもそんなに嬉しいことはないと思われる。


ページ下部に列記された使用例を読む限りでは、ライブラリを自分で作る場合には、他のライブラリとのバッティングを警戒して値をユニークに設定する必要があり、可読性が失われていたものが、Symbolは唯一無二なものになるので他のライブラリとのバッティングを気にする必要がなくなる。
……ということのようだが、少なくともクローズドにJSを書く分には、Stringでいいじゃん、という気がする。
いいのかな。


なんか、ちゃんと理解せずに進むのにためらいを覚えるものの、使わない可能性の高いものに引っかかるのもどうかと思うので、次に行こう!