我正在将一些 Java 代码移植到 JavaScript。我有很多 char
成员元素。使它们成为数字或字符串(其中字符串始终是单个字符)是否更有效?
更新: 它目前在 Java 中的使用方式是:
/** alignment is left. */
public static final char TAB_STOP_LEFT = 'l';
/** alignment is center. */
public static final char TAB_STOP_CENTER = 'c';
/** alignment is right. */
public static final char TAB_STOP_RIGHT = 'r';
private char tabStop;
然后我在很多地方将 TAB_STOP_* 值之一分配给 tabStop 或根据特定值测试 tabStop 的值。不需要它是 l/c/r,我只是使用它们来使其在调试器中更容易阅读(这段代码来自 Java 1.3,早于枚举)。
最简洁的方法是让它们枚举,然后 tabStop 是一个数字。但是,如果每个字符串都是 1 个字符,速度更快且使用的内存更少,我可以改为这样做。
更新 2: 非常感谢 Juan Mendes 和 JLRishe - 非常详细。我决定做的是使用枚举(即数字),因为两者之间的差异很小,而且枚举使一切都更加清晰。
最佳答案
嗯,这里首先要记住的是“过早优化是万恶之源”,除非您合理地担心这会影响应用程序的效率,否则这不太可能成为性能瓶颈。
如果您的目标是提供类似枚举的功能,那么我认为这是数字与字符串不太可能成为问题的更多原因,但如果您在整个应用程序中一致地引用它们,则可以进一步缓解这些担忧, 然后您可以随时来回切换以测试哪个更有效,然后使用最好的那个。
在 Java 中,字符串和 JavaScript 中的其他对象是通过引用存储的,因此在您的情况下,单字符字符串的内存占用量在很大程度上是无关紧要的,问题是对该字符串的引用成本是多少。我找不到关于此的任何决定性信息,但我强烈怀疑这最多是 64 位,因为这是典型现代机器上的最大地址大小。
所以摆在桌面上的问题是:
- 内存使用情况
- 比较两个值的效率
- 易于调试
字符串、数字和对象在#1 上都应该相等,因为数字占用 64 位,而引用占用 64 位。
再次在 #2 上,它们相当均匀地匹配,因为我们可以非常安全地假设 JavaScript 引擎设计者将在比较它们的值之前对两个字符串进行引用相等性检查,因此如果两个变量引用 a 的同一个实例字符串,这应该类似于比较两个数字。
在 #3 上,字符串比数字略有优势,因为您可以直接打印它们,而您需要一个转换步骤才能将数字转换为可理解的值。
因此,我建议在短期内坚持使用字符串,然后在遇到一些性能问题时重新评估。如果你的代码写得好,应该很容易关掉。如上所述,如果您使用对一小组字符串的引用,那么这些字符串的实际大小在很大程度上是微不足道的。因此,请随意使用 "left"
、"center"
、"right"
作为实际值,如果这能让您的调试更容易理解的话。
关于javascript - 什么是 char 的最佳替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23812125/