В es6 возможен такой простой вариант:
// Library:
const enumerable = [];
enumerable[Symbol.iterator] = () => ({
next: () => ({
done: false,
value: Symbol()
})
});
// Code:
const [
ntAnPlusB,
ntAtrule,
ntAtrulePrelude,
ntAttributeSelector,
ntBlock,
ntBrackets,
ntCDC,
ntCDO,
ntClassSelector,
ntCombinator,
ntComment,
ntDeclaration,
ntDeclarationList,
ntDimension,
ntFunction,
ntHexColor,
ntIdentifier,
ntIdSelector,
ntMediaFeature,
ntMediaQuery,
ntMediaQueryList,
ntNth,
ntNumber,
ntOperator,
ntParentheses,
ntPercentage,
ntPseudoClassSelector,
ntPseudoElementSelector,
ntRatio,
ntRaw,
ntRule,
ntSelector,
ntSelectorList,
ntString,
ntStyleSheet,
ntTypeSelector,
ntUnicodeRange,
ntUrl,
ntValue,
ntWhiteSpace
] = enumerable;
document.writeln(String(ntAnPlusB))
document.writeln(String(ntAtrule))
document.writeln(String(ntAtrulePrelude))
document.writeln(String(ntAttributeSelector))
document.writeln(String(ntBlock))
document.writeln(String(ntBrackets))
document.writeln(String(ntCDC))
document.writeln(String(ntCDO))
document.writeln(String(ntClassSelector))
document.writeln(String(ntCombinator))
document.writeln(String(ntComment))
document.writeln(String(ntDeclaration))
document.writeln(String(ntDeclarationList))
document.writeln(String(ntDimension))
document.writeln(String(ntFunction))
document.writeln(String(ntHexColor))
document.writeln(String(ntIdentifier))
document.writeln(String(ntIdSelector))
document.writeln(String(ntMediaFeature))
document.writeln(String(ntMediaQuery))
document.writeln(String(ntMediaQueryList))
document.writeln(String(ntNth))
document.writeln(String(ntNumber))
document.writeln(String(ntOperator))
document.writeln(String(ntParentheses))
document.writeln(String(ntPercentage))
document.writeln(String(ntPseudoClassSelector))
document.writeln(String(ntPseudoElementSelector))
document.writeln(String(ntRatio))
document.writeln(String(ntRaw))
document.writeln(String(ntRule))
document.writeln(String(ntSelector))
document.writeln(String(ntSelectorList))
document.writeln(String(ntString))
document.writeln(String(ntStyleSheet))
document.writeln(String(ntTypeSelector))
document.writeln(String(ntUnicodeRange))
document.writeln(String(ntUrl))
document.writeln(String(ntValue))
document.writeln(String(ntWhiteSpace))
document.writeln('—'.repeat(20))
document.writeln(ntAnPlusB === ntAnPlusB)
document.writeln(ntAtrule === ntAnPlusB)
document.writeln(ntAtrulePrelude === ntAnPlusB)
document.writeln(ntAttributeSelector === ntAnPlusB)
document.writeln(ntBlock === ntAnPlusB)
document.writeln(ntBrackets === ntAnPlusB)
document.writeln(ntCDC === ntAnPlusB)
Здесь, enumerable — наш объект, содержащий итератор, который на каждый вызов возвращает новый уникальный Symbol.
В es6 возможно множественное присваивание, например, такое:
var [varName1, varName2] = ["value1", "value2"]
Вот эти две возможности es6 и позволяют создать такую маленькую и лаконичную реализацию enum. Минус такого подхода — не самая удобная отладка, так как, в данном случае, при создании символов не указывается никакого значения, и они хоть и уникальные, но при преобразовании в строку будут выглядеть одинаково: Symbol().
Можете сами почитать про символы (они очень быстры, идеальное решение для enum), и реализовать свой вариант, например такой:
const enumerable = names =>
names.map(name => Symbol(name));
;
const types = enumerable([
"AnPlusB",
"Atrule",
"AtrulePrelude",
"AttributeSelector",
"Block",
"Brackets",
"CDC",
"CDO",
"ClassSelector",
"Combinator",
"Comment",
"Declaration",
"DeclarationList",
"Dimension",
"Function",
"HexColor",
"Identifier",
"IdSelector",
"MediaFeature",
"MediaQuery",
"MediaQueryList",
"Nth",
"Number",
"Operator",
"Parentheses",
"Percentage",
"PseudoClassSelector",
"PseudoElementSelector",
"Ratio",
"Raw",
"Rule",
"Selector",
"SelectorList",
"String",
"StyleSheet",
"TypeSelector",
"UnicodeRange",
"Url",
"Value",
"WhiteSpace"
]);
for (let [key, val] of Object.entries(types)) {
document.writeln(`${key} => ${val.toString()}`)
}
https://codepen.io/DenVdmj/pen/MBydVQ
https://codepen.io/DenVdmj/pen/RBamza