Показать сообщение отдельно
  #2 (permalink)  
Старый 17.10.2018, 23:10
Интересующийся
Отправить личное сообщение для Denisko-Redisko Посмотреть профиль Найти все сообщения от Denisko-Redisko
 
Регистрация: 08.11.2009
Сообщений: 16

В 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

Последний раз редактировалось Denisko-Redisko, 17.10.2018 в 23:39.
Ответить с цитированием