JavaScriptでenum(列挙型)みたいの

JavaScriptでenum(列挙型)できないのか調べてみたらできました。

const type = {
  CAT: Symbol(),
  DOG: Symbol()
};

const type1 = type.CAT;
const type2 = type.DOG;

console.log(type1 === type2 ? '同じ' : '違う'); 

これ実行すれば期待どおりに次の結果が得られます(ここではsrcフォルダ以下のtype.jsに記述しています)。

   node .\src\type.js
   違う 

CATやDOGに無意味に1とか2を割り当てなくて良いのが素敵です!

ここで今度は次のコードを実行してみます。

const type = {
  CAT: Symbol(),
  DOG: Symbol()
};

const type1 = type.CAT;
const type2 = type.CAT;

console.log(type1);
console.log(type.DOG);
console.log(type1 === type2 ? '同じ' : '違う'); 

実行結果は次です。

  > node .\src\type.js
  Symbol()
  Symbol()
  同じ 

当然ながらCATやDOGが1とか2に変換されて表示されないのは良いのですが、どちらだかわからないですね。

そこで、次にしてみます。

const type = {
  CAT: Symbol('cat'),
  DOG: Symbol('dog')
};

const type1 = type.CAT;
const type2 = type.DOG;

console.log(type1);
console.log(type.DOG);
console.log(type1 === type2 ? '同じ' : '違う');

違いがわかるようになりました。

   node .\src\type.js
   Symbol(cat)
   Symbol(dog)
   違う 

更にこの定義を外部ファイルにして利用する例です。

// type.js
module.exports = type = {
  CAT: Symbol('cat'), 
  DOG: Symbol('dog')
};
// main.js
const type = require('./type');

const type1 = type.CAT;
const type2 = type.CAT;
console.log(type1, type2);

console.log(type1 === type2 ? '同じ' : '違う');