哪一个更好用Javascript中的静态Object或const字符串定义Enum

时间:2017-08-09 15:01:43

标签: javascript v8

我正在使用React-Native项目。在项目中,我需要定义200-300枚举。我想在Java中使用Enum,我也可以使用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;
  }
}

1 个答案:

答案 0 :(得分:1)

V8开发者在这里。当然,对象比字符串大(特别是因为在你的情况下,无论如何你都有字符串,问题是你是否还有一个对象)。对于代码段中的代码,Enum的每个实例都应该是5个指针(对象标题为3个指针,_ordinal_name属性为2个;因此对象大小为5 * 8位= 64位平台上的40字节)。对于每个"对象形状,还有一些内存成本。在程序中,在这种情况下,转换为"您定义的每个类"。

考虑到您所说的要求/目标,我会猜测内存成本是可以接受的。根据您构建代码的方式,还有可能为了在此处切换到字符串,您必须在其他地方使用更多内存来维护相同的功能或界面。

作为旁注:所有反射功能往往有些慢。例如,保持"值"列表作为一个数组,并在请求时将其发送出来比Object.values(this).filter(...instanceof...)链快得多。但是,鉴于您说您为了简单编码而进行了优化,这可能是为了实现您想要的权衡而可以接受的另一个成本。