そんなのあったのか......というレベルだったので調べてみました。調べてみたらけっこう知らない世界でした。ES6、いつのまにかこんなことができたのかって感じ。シンボルとは何なのかプログラミング言語におけるシンボルというのは......名前がついて区別可能なモノ、というのが一般的な理解である気がします。LISPでは多用されますね。メソッドの名前とか構造体のフィールド名、連想配列のキーやenumのようなものとして使ったりします。Rubyでもおなじみです。いう説明が必要な人はあんまりここを読んでない気もするのでwikipediaへのリンクで済ませたい。ES6のシンボルES6のシンボルも似たような感じなんですが、いろいろ違うところもあって戸惑います。Symbol()引数に文字列も渡せます。Symbol("foo")ただ、この文字列はいわゆるシンボル名ではありません。falseSymbol()が呼ばれるたびに毎回あたらしくシンボルが作られるという感じです(gensymと同じですかね)。Symbol()に渡す引数は仕様ではdescriptionと呼ばれています。特定の名前と関連付けられたシンボル、というのも作ることができます。Symbol.forというのがそれです。Symbol.keyForによって名前を逆引きできます。undefinedんでシンボルの用途ですが、オブジェクトへのキーにできます。1まあ文字列と一緒ですね。文字列化しているわけではありません。undefinedそしてなぜか、oのキーとして、シンボルは通常見えなくなります。Object.keys()やfor...in構文などでは無視されるようになります。1JSON.stringifyでも無視されます。"{}"いちおう「キーのうちシンボルだけ」を取り出すAPIもあるので頑張れば持ってこれますが、基本的には見えてこないということですね。シンボルの用途さてこれなんに使うんだろうか......と不思議だったんですが、プライベートなフィールドを作るのに便利そうです。this[sym]...}})()こんなふうに書くと、symのフィールドには外部からはわりと不可視になります。外部から不用意にアクセスできないようなフィールドには便利ですね。一つとして、ある種の構文を提供できるようになるようです。いうかたぶんこれが主な用途なんですかね。for...of構文に渡したりできます。symbols)は現行のES6において11個定義されているみたいですが、Chromeにはまだiteratorしかないようです。