JavaScript. Подробное руководство, 6-е издание, стр. 116
Пример 9.6. Set.js: произвольное множество значений
<b>function Set() { // Это конструктор</b><b> this.values = {}; // Свойства этого объекта составляют множество</b><b> this.n =0; // Количество значений в множестве</b><b> this.add.apply(this. arguments); // Все аргументы являются значениями,</b><b>} // добавляемыми в множество</b><b>// Добавляет все аргументы в множество.</b><b>Set.prototype.add = function() {</b><b> for(var і = 0; і < arguments.length; i++) { // Для каждого аргумента </b><b> var val = arguments[i]; // Добавляемое значение</b><b> var stг = Set._v2s(val); // Преобразовать в строку</b><b> if (!this.values.hasOwnProperty(stг)) { // Если отсутствует в множ,</b><b> this.values[str] = val; // Отобразить строку в знач.</b><b> this.n++; // Увеличить размер множества</b><b> }</b><b> }</b><b> return this; // Для поддержки цепочек вызовов методов</b><b>};</b><b>// Удаляет все аргументы из множества.</b><b>Set.prototype.remove = function() {</b><b> for(var і = 0; і < arguments.length; i++) { // Для каждого аргумента</b><b> var str = Set._v2s(arguments[i]); // Отобразить в строку</b><b> if (this.values.hasOwnProperty(stг)) { // Если присутствует в множ,</b><b> delete this.values[str]; // Удалить</b><b> this.n--; // Уменьшить размер множества</b><b> }</b><b> }</b><b> return this; // Для поддержки цепочек вызовов методов</b><b>}</b><b>// Возвращает true, если множество содержит value; иначе возвращает false.</b><b>Set.prototype.contains = function(value) {</b><b> return this.values.has0wnProperty(Set._v2s(value));</b><b>};</b><b>// Возвращает размер множества.</b><b>Set.prototype.size = function() { return this.n; };</b><b>// Вызывает функцию f в указанном контексте для каждого элемента множества.</b><b>Set.prototype.foreach = function(f, context) {</b><b> for(var s in this.values) // Для каждой строки в множестве</b><b> if (this.values.hasOwnProperty(s)) // Пропустить унаследов. свойства</b><b> f.call(context. this.values[s]); // Вызвать f для значения</b><b>};</b><b>// Функция для внутреннего использования. Отображает любые значения JavaScript</b><b>// в уникальные строки.</b><b>Set._v2s = function(val) {</b><b> switch(val) {</b><b> case undefined: return 'u'; // Специальные простые значения</b><b> case null: return 'n'; // отображаются в односимвольные строки.</b><b> case true: return 't';</b><b> case false: return 'f;</b><b> default: switch(typeof val) {</b><b> case 'number': return + val; // Числа получают префикс #.</b><b> case 'string': return "" + val; // Строки получают префикс ".</b><b> default: return '@' + objectId(val); // Объекты и функции - @</b><b> }</b><b> }</b><b> // Для любого объекта возвращается строка. Для разных объектов эта функция</b><b> // будет возвращать разные строки, а для одного и того же объекта всегда</b><b> // будет возвращать одну и ту же строку. Для этого в объекте о создается свойство.</b><b> // В ES5 это свойство можно сделать неперечислимым и доступным только для чтения,</b><b> function objectld(o) {</b><b> var prop = "I **objectid**|”; // Имя частного идентификац. свойства</b><b> if (!о.hasOwnProperty(prop)) // Если объект не имеет этого свойства</b><b> о[ргор] = Set._v2s.next++; // Присвоить ему след, доступ, значение</b><b> return о[ргор]; // Вернуть идентификатор</b><b> }</b><b>};</b><b>Set._v2s.next = 100; // Начальное значение для идентификаторов объектов.</b>9.6.2. Пример: типы-перечисления
Перечислениями называются типы, которые могут принимать конечное количество значений, объявляемых (или «перечисляемых») при определении типа.