Я відновлював старий проект Java в Javascript і зрозумів, що не існує хорошого способу зробити перерахунки в JS.
Найкраще, що я можу придумати, це:
const Colors = {
RED: Symbol("red"),
BLUE: Symbol("blue"),
GREEN: Symbol("green")
};
Object.freeze(Colors);
const
Зберігає Colors
від бути змінені, і заморожування він запобігає мутує ключі і значення. Я використовую Symbols так, що Colors.RED
не є рівним 0
, або будь-що інше, крім самого себе.
Чи є проблема з цією рецептурою? Чи є кращий спосіб?
(Я знаю, що це питання трохи повторюється, але всі попередні питання Q / як це вже досить давно, і ES6 дає нам нові можливості.)
Редагувати:
Ще одне рішення, яке стосується проблеми серіалізації, але я вважаю, що все ще є проблеми:
const enumValue = (name) => Object.freeze({toString: () => name});
const Colors = Object.freeze({
RED: enumValue("Colors.RED"),
BLUE: enumValue("Colors.BLUE"),
GREEN: enumValue("Colors.GREEN")
});
Використовуючи посилання на об'єкти як значення, ви отримуєте те саме уникнення зіткнень, що і символи.
JSON.stringify()
. Неможливо серіалізувати / десеріалізувати Symbol
.