реализация enum в js
В С# есть тип данных enum который нужен для создания перечислений, в js слово enum за резервировано но такой функции я так понял в js нету и решается эта проблема подобным кодом
function _enum_ (_name,Elems) { var elem,value; window[_name] = {}; for (var i = Elems.length;i--;) { elem = Elems[i]; value = elem.replace(/\s/g,'').split('='); window[_name][value[0]] ={ value: value[0], int:value[1] | i, toString: function () { return this.value; } }; } } _enum_( 'WeekDays', ['Monday = 20', 'Tuesday', 'Wednesday', 'Thursday', 'Friday' , 'Saturday', 'Sunday']); alert(WeekDays.Tuesday); Вопрос в том , я плохо искал или и в правду нужно это реализовать вручную? Просто не могу понять ситуацию в js c enum... |
В 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 |
function Enum([definition]) { return Object.freeze( definition .trim() .split(/\s+/) .reduce((m, p) => ({ ...m, [p]: Symbol(p), __proto__: null }), {}) ); } // Примеры const Color = Enum` RED GREEN BLUE `; const Cardsuits = Enum` CLUBS DIAMONDS HEARTS SPADES `; console.log(Color, Cardsuits); // Используется так: Color.RED и т. д. |
Поскольку в js нет enum, то просто пользуются обычно константными свойствами объекта.
Не настолько необходим enum, чтоб его имитировать. |
Часовой пояс GMT +3, время: 04:05. |