![]() |
1
1142
从1.8.5开始,可以 seal and freeze the object ,因此将上述定义为:
瞧!JS枚举。 但是,这并不妨碍您为变量指定不需要的值,这通常是枚举的主要目标:
确保更高程度的类型安全性(使用枚举或其他方式)的一种方法是使用类似 TypeScript 或 Flow 不需要引用,但我保留了它们以保持一致性。 |
![]() |
2
624
这不是一个很好的答案,但我个人认为这很好 话虽如此,由于值是什么并不重要(您已经使用了0、1、2),因此如果您想要输出当前值,我将使用一个有意义的字符串。 |
![]() |
3
519
使现代化已可以对该名称发出警报:
或者,您可以将值设置为对象,这样您就可以吃蛋糕了:
在JavaScript中,由于它是一种动态语言,因此以后甚至可以向集合中添加枚举值:
记住,枚举的字段(本例中的值、名称和代码)不需要用于身份检查,只是为了方便起见。此外,size属性本身的名称不需要硬编码,但也可以动态设置。因此,假设您只知道新枚举值的名称,您仍然可以添加它而不会出现问题:
当然,这意味着无法再进行某些假设(例如,该值表示大小的正确顺序)。 记住,在JavaScript中,对象就像 地图 或 实例
顺便说一句,如果您对名称空间感兴趣,您可能想看看我为JavaScript提供的简单但功能强大的名称空间和依赖关系管理解决方案: Packages JS |
![]() |
4
89
这种方法的问题是什么?您可能会意外地重新定义枚举数,或意外地具有重复的枚举数值。例如:
编辑
绝对地
现在现在它打开了一些 非常
编辑2
http://www.2ality.com/2011/10/enums.html 虽然它可能不适合枚举的所有有效使用,但它有很长的路要走。 |
![]() |
5
61
以下是我们都想要的:
通过这样做,常数可以以通常的方式进行访问(YesNo.YES,Color.GREEN),它们得到一个连续的int值(NO=0,YES=1;RED=0,GREEN=1,BLUE=2)。 还可以使用Enum.prototype添加方法:
|
![]() |
6
58
在大多数现代浏览器中,都有一个
symbol
可用于创建枚举的基元数据类型。它将确保枚举的类型安全,因为JavaScript保证每个符号值都是唯一的,即。
GitHub 您可以找到简化初始化枚举所需代码的包装器:
|
![]() |
7
43
-°让我们直接切入问题:文件大小。这里列出的每一个答案都会将您的精简代码膨胀到极致。我向您介绍,为了通过在许多代码编辑器中进行缩小、性能、代码可读性、大规模项目管理和语法暗示来尽可能地减少代码大小,这是进行枚举的正确方法:下划线符号变量。 如上图和下面的示例所示,这里有五个简单的开始步骤:
然而
注意,在上面的代码中,添加一种新的宠物非常容易:只需在之后添加一个新条目
此外,这种枚举语法允许进行清晰简洁的类扩展,如下所示。要扩展类,请向
(长度:2450字节) 有人可能会说,这比其他解决方案更不实用:它浪费了大量的空间,需要很长时间来编写,而且没有糖衣语法。如果这些人不缩小他们的代码,他们是对的。然而,任何通情达理的人都不会在最终产品中留下未统一的代码。对于这种缩小,闭包编译器是我迄今为止找到的最好的。可以找到在线访问 here . 闭包编译器能够获取所有这些枚举数据并将其内联,从而使您的Javascript非常小,运行起来非常快。因此,可以使用闭包编译器进行缩小。看到 ðð¹ð¼ððð¿ð² ðð¼ðºð½ð¶ð¹ð²ð¿闭包编译器能够通过推理执行一些非常难以置信的优化,这些推理远远超出了任何其他Javascript迷你程序的能力。闭包编译器能够将原始变量内联设置为固定值。闭包编译器还能够基于这些内联值进行推断,并消除if语句和循环中未使用的块。
(长度:605字节) 闭包编译器会奖励您更聪明地编写代码并很好地组织代码,因为许多缩略器会用更大的缩略文件大小来惩罚有组织的代码,而如果您使用变量名枚举之类的技巧,闭包编译器能够筛选您所有的整洁度和健全度,以输出更小的文件大小。在这一点上,这就是编码的圣杯:一种既能以较小的尺寸帮助您编写代码,又能通过培养更好的编程习惯来帮助您的思维的工具。
Source Without Using Enumerations
(长度:1973字节(比枚举代码短477字节!))
如图所示,在没有枚举的情况下,源代码更短,但代价是代码更大。我不了解你;但我确信我不会将源代码合并到最终产品中。因此,这种枚举形式的优越性非常大,它可以缩小文件大小。 这种枚举形式的另一个优点是,它可以轻松地管理大型项目,而不会牺牲较小的代码大小。当与许多其他人一起处理一个大型项目时,显式地标记和标记变量名以及创建代码的人可能是有益的,这样就可以快速确定代码的原始创建者,以便进行协作性错误修复。
此外,这种形式的枚举在缩小后也要快得多。在普通命名属性中,浏览器必须使用hashmaps查找对象上的属性位置。尽管JIT编译器可以智能地在对象上缓存该位置,但由于特殊情况(如从对象中删除较低的属性),仍然会产生巨大的开销。 但是,对于连续非稀疏整数索引 PACKED_ELEMENTS 数组,浏览器可以跳过大部分开销,因为内部数组中的值的索引已经指定。是的,根据ECMAScript标准,所有属性都应该被视为字符串。然而,ECMAScript标准的这一方面在性能方面是非常误导的,因为所有浏览器都对数组中的数字索引进行了特殊的优化。
将上面的代码与下面的代码进行比较。
有人可能会反对使用枚举的代码看起来比使用普通对象的代码要长得多,但外观可能是欺骗。使用epic闭包编译器时,请务必记住源代码大小与输出大小不成正比。看到
上面是不带枚举的缩小代码,下面是带枚举的缩小代码。
上面的示例表明,除了具有优异的性能外,枚举代码还可以缩小文件大小。 ðð®ðð ðð²ð¯ðð´ð´ð¶ð»ð´
上面的樱桃
正在将这种形式的枚举与
CodeMirror
Javascript模式下的文本编辑器。CodeMirror的Javascript语法突出显示模式突出显示当前作用域中的局部变量。这样,您就可以立即知道何时正确键入变量名,因为如果变量名以前是用
在上面的代码段中,您收到了一个错误警报,因为
°我认为可以肯定地说,这种枚举方法确实是最好的方法,不仅适用于缩小代码大小,而且适用于性能、调试和协作。 |
![]() |
8
30
使用Javascript Proxies
TLDR:
将该类添加到实用程序方法中并在整个代码中使用,它模仿传统编程语言中的枚举行为,并在尝试访问不存在的枚举数或添加/更新枚举数时实际抛出错误。无需依赖
详细说明: 从传统语言中获得的枚举的一个非常有益的特性是,如果您试图访问一个不存在的枚举数,它们就会爆炸(抛出编译时错误)。 除了冻结模拟枚举结构以防止意外/恶意添加附加值之外,其他答案都没有解决枚举的固有特性。
您可能知道,访问JavaScript中不存在的成员只会返回
别误会,JavaScript的返回行为
这就是代理对象发光的地方。随着ES6(ES2015)的引入,代理被标准化为该语言。以下是MDN的描述:
与web服务器代理类似,JavaScript代理能够拦截对象上的操作(使用“陷阱”,如果您愿意,可以称它们为钩子),并允许您在对象完成之前执行各种检查、操作和/或操作(或者在某些情况下完全停止操作,这正是我们在尝试引用不存在的枚举数时想要做的事情)。
旁白:代理到底是什么?
|
![]() |
9
23
我一直在玩这个,因为我喜欢我的枚举
使用
下面是一个JSFIDLE: http://jsfiddle.net/ZV4A6/
因为这个属性
因此,您应该能够创建一个自定义对象,然后调用
|
![]() |
10
17
我知道这是一个旧版本,但后来通过TypeScript接口实现它的方式是:
|
![]() |
11
17
在里面 ES7 ,您可以根据静态属性执行优雅的枚举:
然后
|
![]() |
12
15
这就是我使用的解决方案。
您可以这样定义枚举:
以下是访问枚举的方式:
我通常使用最后两种方法从消息对象映射枚举。 这种方法的一些优点:
一些缺点:
|
![]() |
13
15
创建对象文字:
|
![]() |
14
11
如果你正在使用 Backbone Backbone.Collection .
|
![]() |
15
8
你的答案太复杂了
|
![]() |
16
7
测试:
|
![]() |
17
7
我想出了
this
您可以这样定义枚举:
|
![]() |
18
7
我对任何一个答案都不满意,所以我做出了决定 . 这一实施:
Andre 'Fi''s answer 为了一些灵感。
用法:
|
![]() |
19
6
在我当前的游戏项目中,我使用了以下方法,因为很少有客户仍然使用IE8:
我们还可以做:
甚至这个:
任务:
比较:
|
![]() |
20
5
|
![]() |
21
5
最简单的解决方案: 创造
获得价值
拿到钥匙
|
![]() |
22
5
代码:
|
![]() |
23
5
这可能很有用:
实施过程简单高效:
|
![]() |
24
4
一个快速而简单的方法是:
|
![]() |
25
4
最简单的方法是在对象上迭代,向对象添加反转的键值对。唯一的缺点是必须手动设置每个成员的值。
|
![]() |
26
4
我刚刚发布了一个NPM包 gen_enum 允许您在Javascript中快速创建枚举数据结构:
这个小工具的一个优点是在现代环境中(包括nodejs和ie9+浏览器),返回的Enum对象是不可变的。 欲了解更多信息,请结帐 https://github.com/greenlaw110/enumjs
我过时了
到
|
![]() |
27
4
我创建了一个枚举类,它可以在O(1)处获取值和名称。它还可以生成包含所有名称和值的对象数组。
要获取值的名称(在为不同的名称放置相同的值时可能不明确):
获取包含每个名称的数组&对象中的值:
其中包括:
|
![]() |
28
4
尽管
only static methods
(而非静态属性)在ES2015中受支持(请参见
here
我发现即使跨模块(例如导入
与大多数其他答案相比,此方法的优势在于,您可以将其与静态类型检查器一起使用
(例如。
Flow
使现代化
|
![]() |
29
4
这就是Typescript如何翻译它的
现在:
起初我不明白为什么
|
![]() |
30
4
你可以这样做
如本库中所定义。 https://github.com/webmodule/foo/blob/master/foo.js#L217 https://gist.github.com/lnt/bb13a2fd63cdb8bce85fd62965a20026 |
![]() |
tomm · 谷歌表格-将两列相乘,复制第三列 3 年前 |
![]() |
ziemsterr · 无法在SQL SELECT语句中找出此语法错误 3 年前 |
![]() |
Andrés BolÃvar · AJAX请求未收到我想要的属性 3 年前 |
![]() |
clarkk · 当声明向量时,(1)是什么意思? 3 年前 |
![]() |
Mike C. · Bash错误[:检查文件是否存在时缺少“]” 3 年前 |
![]() |
michael · 错误的脚本和语法问题 3 年前 |