簡體   English   中英

用靜態對象或JavaScript中的const字符串定義枚舉哪個更好

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

我正在做一個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;
  }
}

V8開發人員在這里。 當然,對象比字符串大(特別是因為在您的情況下,無論如何您都擁有字符串,而問題是您是否還擁有對象)。 對於代碼段中的代碼, Enum每個實例都應為5個指針大(對象標頭為3個指針, _ordinal_name屬性為2個指針;因此在64位平台上,對象大小為5 * 8b = 40字節)。 程序中每個“對象形狀”也要花費一些內存,在這種情況下,這會轉化為“定義的每個類”。

考慮到您已經陳述的要求/目標,我內存成本是可以接受的。 根據您代碼的結構方式,為了在這里切換到字符串,您還必須在其他地方使用更多的內存來維護相同的功能或接口。

附帶說明:所有反射功能往往會變慢。 例如,將“值”列表保留為數組並在請求時將其Object.values(this).filter(...instanceof...)鏈要快得多。 但是,假設您說您正在為簡化編碼而進行優化,那么這可能是實現所需折衷的另一種可接受的成本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM