Javascript 为什么在枚举中使用二进制移位

Javascript 为什么在枚举中使用二进制移位,javascript,angular,typescript,enums,Javascript,Angular,Typescript,Enums,我正在查看以下代码: /** * Bitmask of states */ export const enum ViewState { FirstCheck = 1 << 0, // result is 1 ChecksEnabled = 1 << 1, // result is 2 Errored = 1 << 2, // result is 4 Destroyed = 1 <<

我正在查看以下代码:

/**
 * Bitmask of states
 */
export const enum ViewState {
    FirstCheck = 1 << 0,      // result is 1
    ChecksEnabled = 1 << 1,   // result is 2
    Errored = 1 << 2,         // result is 4
    Destroyed = 1 << 3        // result is 8
}
/**
*状态位掩码
*/
导出常量枚举视图状态{

FirstCheck=1因为它更容易阅读(对我来说,显然对作者也是如此)。随着这个列表的增长,它变得更容易(对人类而言)要添加第16个元素并使用1此枚举模拟四个标志的概念,每个标志可以是on/true/one或off/false/zero。您可以通过逻辑方式或将所需的值组合在一起,将枚举设置为值。例如:

z = ViewState.FirstCheck | ViewState.ChecksEnabled
在代码的后面部分,您可以通过对所有值进行逻辑化并将值与要检查的值进行比较,从而相互独立地检查这些值:

if (z & ViewState.FirstCheck) {
  do_something();
}

if (z & ViewState.ChecksEnabled) {
  do_something_else();
}

确保可以将枚举值分解为一组不同的、明确的标志的最简单方法是将单独的值作为二的幂。

因为它更容易阅读(对我来说是这样,显然对作者也是如此)。随着此列表的增加,它变得更容易(对人而言)要添加第16个元素并使用
1@Igor,感谢您的建议,但在代码中,它仍然始终是
ViewState.destromed
,因此,如果要将多个值一起进行或运算(这是位掩码的典型情况),则该值是多少并不重要,那么有什么数字就很重要了。你说它总是
它仍然总是ViewState是什么意思?销毁了
?有4个值,也许以后会有第5个值。作者可以将此作为编写枚举标志的惯例,即使只有4个项。@Igor,啊,是的,谢谢,我一开始不明白你的意思@Maximus-这里有一个关于如何组合的快速示例和一个关于如何检查是否有值的示例。也许这就是您要寻找的?是的,知道了,非常感谢您的解释。ViewState中的所有这些值都只有一个位集,这就是为什么我得到1,2,4,8..16,32…等等。
if (z & ViewState.FirstCheck) {
  do_something();
}

if (z & ViewState.ChecksEnabled) {
  do_something_else();
}