javascript - 为什么在这里使用指数枚举键?

标签 javascript typescript parsing compilation

Here 你可以找到这段代码:

enum NodeFlags {
    None = 0,
    Let = 1,
    Const = 2,
    NestedNamespace = 4,
    Synthesized = 8,
    Namespace = 16,
    ExportContext = 32,
    ContainsThis = 64,

而且我在其他地方也看到过这样的数字常量。这样做的目的是什么?

我的猜测是,稍后在现有项目之间的某处添加一些新项目。尤其是在看到这个之后:

    ThisNodeHasError = 32768,
    JavaScriptFile = 65536,
    ThisNodeOrAnySubNodesHasError = 131072,
    HasAggregatedChildData = 262144,
    JSDoc = 1048576,
    BlockScoped = 3, // three?

但是在这种情况下,使用 100、200、300 等数字不是更容易吗?

另一种猜测是与位运算有关,但看到3后我完全不确定。

FWIW,列表以完全奇怪的方式结束:

    ReachabilityCheckFlags = 384,
    ReachabilityAndEmitFlags = 1408,
    ContextFlags = 6387712,
    TypeExcludesFlags = 20480,

附言指数在这里可能不正确(所以很抱歉,欢迎您纠正我)。

最佳答案

原因是这个枚举被用作标志枚举。这些值可以使用按位或 (|) 运算符组合。所以你可以有一个同时是枚举成员的值

let x = NodeFlags.AwaitContext  | NodeFlags.ThisNodeHasError // The node is both an await context but also has errors

基本上值中的每一位都是一个独立的标志。他们本可以在节点上使用单独的标志,例如 isLetisConstisAwaitContextisError 等,但是这在内存方面和编译器方面都是浪费,因为有很多节点。像这样一个 64 位的单个字段可以表示 64 个标志。

要提取设置的值,您可以使用 & 运算符,例如 x & NodeFlags.ThisNodeHasError !== 0 表示 ThisNodeHasError 设置在 x 变量。

关于javascript - 为什么在这里使用指数枚举键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55162652/

相关文章:

c - Z3:从字符串中解析术语

c++ - 语法问题

parsing - 执行语义操作时 Ocamlyacc token 不可见

javascript - 如何获取扩展图像文件 jquery.filer

TFS 构建不在服务器上构建 typescript 文件

javascript - 如何使用 JS/CSS/HTML5 动画来获得类似 Flash 的动画?例如 PagePeel

Angular - HostListener 指令和传递值

typescript - 检查后仍出现 "Object is possibly undefined"错误

javascript - 无法清除超时

javascript - 解析带有子元素的 json 对象出错