Development

ES2015でenumを作ってみる

javascriptにはenumという型はありませんので、今まで(ES5)は以下のように擬似的にenum的なものを作っていました

var Sample = {
  One: "one",
  Two: "two"
};

ついでに const 宣言も無かったので後から書き換え可能になっているのも残念なところです。

ES2015になってつい嬉しくて const 宣言を使って以下のようにしていました。

const Sample = {
  One: "one",
  Two: "two"
};

しかしこれも実は残念なところがあって、値が文字列である以上他の由来の文字列でも比較がtrueになってしまうのです。

const Sample = {
  One: "one",
  Two: "two"
};
const Other = {
  One: "one",
  Two: "two"
};

console.log(Sample.One === Other.One); // => true

これはいただけませんね。enumの役割をちゃんと果たしていません。

ES2015ではSymbolが使えるようになったので以下のようにするととってもいい感じだとおもいます。

const Sample = {
  One: Symbol("one"),
  Two: Symbol("two")
};
const Other = {
  One: Symbol("one"),
  Two: Symbol("two")
};

console.log(Sample.One === Other.One); // => false

Symbol() はグローバルにユニークな値を返すので、同じ引数で実行しても結果が異なるためにこのような使い方ができるわけです。

ちなみにグローバルに同一なSymbolを参照したい場合は Symbol.for() を使うといいみたいです。

let one = Symbol.for("one");
console.log(one === Symbol.for("one")); // => true

Symbolのブラウザでの実装状況はこちら http://kangax.github.io/compat-table/es6/#test-Symbol

標準