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
基本上值中的每一位都是一个独立的标志。他们本可以在节点上使用单独的标志,例如 isLet
、isConst
、isAwaitContext
、isError
等,但是这在内存方面和编译器方面都是浪费,因为有很多节点。像这样一个 64 位的单个字段可以表示 64 个标志。
要提取设置的值,您可以使用 &
运算符,例如 x & NodeFlags.ThisNodeHasError !== 0
表示 ThisNodeHasError 设置在 x
变量。
关于javascript - 为什么在这里使用指数枚举键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55162652/