在Javascript中,使用静态对象或常量字符串定义枚举哪个更好

在Javascript中,使用静态对象或常量字符串定义枚举哪个更好,javascript,v8,Javascript,V8,我在做一个本地项目。在项目中,我需要定义200-300枚举。我想像在Java中一样使用Enum,而且我还可以在immutable.js Map/Set中使用Enum作为键。这使得我的代码非常容易编写。但是,我可以用字符串替换这些枚举对象。现在我关心的是内存使用。我不知道一个对象是否会消耗大量内存。哪一个更好?有什么建议吗 export class Enum { static values() { return Object.values(this).filter(value =>

我在做一个本地项目。在项目中,我需要定义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开发者。当然,对象比字符串大,特别是在你的例子中,你有字符串,问题是你是否还有一个对象。对于代码段中的代码,Enum的每个实例都应该是5个指针,3个指针用于对象头,2个指针用于_ordinal和_name属性;因此,在64位平台上,对象大小将为5*8b=40字节。程序中的每个对象形状都有一些内存开销,在本例中,这些内存开销会转换为您定义的每个类

考虑到您提出的要求/目标,我想内存成本是可以接受的。根据您的代码结构,您还可能需要在其他地方使用更多内存来维护相同的功能或接口,以便在此处切换到字符串


作为旁注:所有反射功能都有点慢。例如,将值列表保持为一个数组,并在请求时将其发送出去,这比Object.ValuestThis.filter…instanceof。。。链条但是,如果你说你正在优化,以便于编码,这可能是另一个可以接受的成本,以实现你想要的折衷。

你考虑过吗?你可能也想考虑抱歉,我没有解释足够。我已经修改了我的代码。我想他不关心创建200个对象或200个字符串。区别应该在于它们的使用频率,例如在登录函数中,我的理解是两者都归结为相同大小的指针——不管它们后面是对象还是字符串。同意;如果您只看一个类似{type:reduxation.LOGIN}的代码段,那么reduxation.LOGIN是否指向对象、字符串、数字或任何东西都没有区别。谢谢大家!事实上,我只有10到20个重复动作,所以我真的不担心。但是,我昨天统计了大约500个静态游戏对象,这才是我真正担心的。正如@jmrk提到的,即使我不使用Enum,我仍然必须在其他地方维护相同的数据。游戏枚举只是将所有数据包装在一起的包装器。对于值,我在代码中不经常使用,所以留在那里也没关系。@Bergi,它们中的大多数不经常使用,但如果它们被定义为Enum,我可以编写这种代码来避免切换模式。渲染{return Map[[Game.Game_A,=>],[Game.Game_B,=>].getgame}案例1有不必要的开销每个函数对象需要内存,每个调用需要时间。一般来说,一个简单的x显然是?比函数{return x;};更有效;。