在 Javascript 中用 static Object 和 const string 定义 Enum 哪个更好

Which one is better to define Enum by static Object or const string in Javascript

我正在做一个 React-Native 项目。在项目中,我需要定义 200-300 个枚举。我想像在 Java 中那样使用 Enum,也可以在 immutable.js Map/Set 中使用 Enum 作为键。这使我的代码非常容易编写。但是,我可以用字符串替换这些枚举对象。现在我关心的是内存使用情况。我不知道一个对象是否会消耗大量内存。哪一个更好?有什么建议吗?

export class Enum {
  static values() {
    return Object.values(this).filter(value => value instanceof Enum);
  }

  static build() {
    let count = 0;
    for (const [key, value]: [string, any] of Object.entries(this)) {
      if (value instanceof Enum) {
        value._ordinal = count++;
        value._name = key;
        makeImmutable(value);
      }
    }
    Object.freeze(this);
  }

  _ordinal: number;
  _name: string;

  name() {
    return this._name;
  }

  ordinal() {
    return this._ordinal;
  }

  toString() {
    return JSON.stringify(this);
  }
}

export class ReduxAction extends Enum {
  static LOGIN = new ReduxAction();
  static LOGOUT = new ReduxAction();
}
ReduxAction.build();

export function login() {
  return {type: ReduxAction.LOGIN};
}

export class Game extends Enum {
  static GAME_A = new Game('A', (data) => data.length);
  static GAME_B = new Game('B', (data) => data.length * 2);

  name: string;
  countScore: Function;
  constructor(name: string, countScore: Function) {
    super();
    this.name = name;
    this.countScore = countScore;
  }
}

这里是 V8 开发人员。 Objects 当然比字符串大(特别是因为在您的情况下,无论如何您都有字符串,问题是除此之外您是否还有 object )。对于代码段中的代码,Enum 的每个实例都应该大 5 个指针(object header 有 3 个指针,_ordinal_name 有 2 个指针属性;因此 object 大小在 64 位平台上将为 5 * 8b = 40 字节)。程序中每个 "object shape" 也有一些内存成本,在本例中转换为 "every class you define".

猜测 考虑到您所说的 requirements/goals,内存成本是可以接受的。根据您构建代码的方式,也有可能为了在此处切换到字符串,您必须在别处使用更多内存以保持相同的功能或界面。

附带说明:所有的反射功能往往都有些慢。例如,将 "values" 列表保存为数组并在请求时分发它会比 Object.values(this).filter(...instanceof...) 链快得多。但是,鉴于您说您正在优化以简化编码,为了实现您想要的权衡,这可能是另一个可以接受的成本。