Js中的枚举

原文见

Js中的枚举


在JavaScript目前的版本中,没有枚举这个概念(当然,ECMA-262第三版中已经将enum作为关键字保留)。
然而,如同JavaScript中没有class一样,但我们仍然可以通过间接的方式——JSON来实现它。

  如下,我们来定义Week的枚举:
        if(typeof WeekDay == "undefined"){
            var WeekDay = {};
            WeekDay.Sunday = 0;
            WeekDay.Monday = 1;
            WeekDay.Tuesday = 2;
            WeekDay.Wedesay = 3;
            WeekDay.Thursday = 4;
            WeekDay.Friday = 5;
            WeekDay.Saturday = 6;
        }

  测试如下:
            alert(WeekDay.Monday);  // -----> Output: 1

 
  当然,我们有更为直观的方式。以定义DOM文档节点类型为例,定义方式如下:
        if(typeof Node == "undefined"){
            var Node = {
                ELEMENT_NODE: 1,
                ATTRIBUTE_NODE: 2,
                TEXT_NODE: 3,
                CDATA_SECTION_NODE: 4,
                ENTITY_REFERENCE_NODE: 5,
                ENTITY_NODE: 6,
                PROCESSING_INSTRUCTION_NODE: 7,
                COMMENT_NODE: 8,
                DOCUMENT_NODE: 9,
                DOCUMENT_TYPE_NODE: 10,
                DOCUMENT_FRAGEMENT_NODE: 11,
                NOTATION_NODE: 12
            }
        }

   

    测试如下:

       alert(document.nodeType == Node.DOCUMENT_NODE);  // -----> Output: true

 

    说明,以上Node定义可作为纠正IE不支持DOM节点类型常量用(其他主流浏览器均支持)。

 

  与类C语言类似,以上2个例子的枚举对应属性值均为整形。你可能想到,难道还能定义成别的类型?

   要回答这个问题,得先知道咱们这个枚举实现的原理。前面说到,这里是用JSON来实现的,而JSON可以使用任何类型的值!

   所以,Js中的枚举可以是任何类型的值。以下以String类型为例:

 

        if(typeof Color == "undefined"){
            var Color = {
                Color1: 'red',
                Color2: 'green',
                Color3: 'white',
                Color4: 'black'
            }
        }

  测试如下:

        alert(Color.Color1);  // -----> Output: red

  以更为复杂的类型来定义一个PersonList枚举如下:

 

        if(typeof PersonList == "undefined"){
            var PersonList = {
                ZhangSan: {
                    Id: 1,
                    Name: 'ZhangSan',
                    Gender: 'man'
                },
                LiSi: {
                    Id: 2,
                    Name: 'LiSi',
                    Gender: 'woman'
                },
                ZhaoWu: {
                    Id: 3,
                    Name: 'ZhaoWu',
                    Gender: 'man'
                }
            }
        }

<think>好的,我现在需要回答用户的问题:如何在 JavaScript 中定义枚举类型。根据用户提供的引用资料,JavaScript本身没有内置的枚举类型,但可以通过其他方法模拟。首先,我要整理这些引用中的信息,然后按照用户的要求结构化回答。 首先,用户引用了五篇资料,其中前四篇是关于JavaScript的,第五篇提到Python的枚举,但用户的问题集中在JavaScript上,所以主要参考前四篇。引用[1]提到可以通过多种方式模拟枚举,比如对象字面量或冻结对象。引用[2]指出JavaScript没有enum关键词,需要自己创建。引用[3]提到TypeScript有枚举,但JavaScript需要用其他方法。引用[4]展示了使用对象和遍历的方法。 接下来,我需要将这些信息整理成几种常用的方法,并给出示例代码。可能的方法包括:使用对象字面量、冻结对象、结合值和反向映射、使用类封装。每个方法需要简要说明和代码示例,如用户示例中的Python代码那样用代码块展示。 然后,需要注意用户给出的系统级指令,比如行内数学表达式用$...$,但这里可能用不上数学公式,主要关注代码格式。确保回答结构清晰,分点说明,并在每个方法后可能添加相关应用场景或注意事项。 还要生成相关问题,这部分需要考虑用户可能进一步的问题,比如枚举的应用场景、如何防止修改、TypeScript中的差异等。 检查是否所有引用都正确标注,比如在提到冻结对象时引用[1]和[3],在类封装时引用[4]。确保没有使用Markdown格式,但代码块需要用反引号包裹,语言注明为javascript。 最后,验证示例代码的正确性,比如Object.freeze是否确实能防止修改,类的方法是否正确。可能遇到的问题是如何确保枚举不可变,所以需要强调使用Object.freeze的重要性。 总结步骤:分四个方法介绍,每个方法给出代码示例,说明优缺点,最后添加相关问题。</think>### JavaScript 中定义枚举类型的方法 JavaScript 本身不提供内置的枚举类型[^2][^3],但可以通过以下方式模拟枚举的行为: --- #### 1. **使用对象字面量** 通过常量对象定义枚举值,避免直接修改: ```javascript const Color = { RED: 'red', GREEN: 'green', BLUE: 'blue' }; ``` - **优点**: 简单直观。 - **缺点**: 属性可能被意外修改。 --- #### 2. **冻结对象防止修改** 使用 `Object.freeze()` 使枚举不可变[^1][^3]: ```javascript const Status = Object.freeze({ PENDING: 0, APPROVED: 1, REJECTED: 2 }); ``` - **特性**: 对象属性无法增删改,避免运行时错误。 --- #### 3. **结合值与反向映射** 为枚举值同时提供键值对和反向查询功能: ```javascript const Direction = Object.freeze({ NORTH: { value: 1, display: 'North' }, SOUTH: { value: 2, display: 'South' } }); // 通过值获取枚举项 const getDirectionByValue = (value) => Object.values(Direction).find(item => item.value === value); ``` --- #### 4. **使用类封装** 通过类实现更复杂的枚举逻辑(如遍历成员)[^4]: ```javascript class Season { static SPRING = new Season('spring'); static SUMMER = new Season('summer'); constructor(name) { this.name = name; } // 遍历所有枚举值 static getAll() { return Object.values(Season).filter(v => v instanceof Season); } } ``` --- ### 应用场景 - **状态管理**: 如订单状态(待处理、已发货)[^1]。 - **配置参数**: 如颜色主题、用户权限等级。 - **替代魔法字符串**: 避免代码中直接使用未定义的字符串或数字。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值