我试图理解为什么Javascript程序员看不到使用类似枚举的对象来表示常量值而不是在整个代码中重复字符串的价值?例如:
foo.addEventListener("someEvent", function(event) { .... });
VS
foo.addEventListener(events.someEvent, function(event) { .... });
对我而言,第二个似乎更优越,因为像JSLint这样的工具在传递无效值时更有可能解决(如果它可以看到events
的声明)。
我听到的支持字符串的论据基本上是“这就是javascript程序员如何做到这一点”这让我感到烦恼,因为它似乎面对几乎所有其他语言的最佳实践我曾经工作过。
所以请帮助我理解:这是我试图在JS开发人员上强调我的C习惯的一个案例 - 我是否需要学会改变我的方式?
答案 0 :(得分:3)
我个人没有,但我认为问题在于许多JS编码器没有意识到你可以(ab)使用关联数组来产生类似枚举的效果。
var events = {
someEvent : "someEvent",
someOtherEvent : "someOtherEvent"
}
foo(events.someEvent);
这样做绝对是一种好习惯,避免了很多编码问题。
答案 1 :(得分:1)
在JavaScript中,属性查找可能很昂贵(范围遍历加上长原型链)。
我还没有看到静态分析器(包括JSLint)实际上接收到对象的内容。
就我个人而言,我喜欢你的方法,但它需要权衡。
答案 2 :(得分:1)
我不确定是谁告诉你的,但我个人已经开始专注于Web开发,他们建议你把变量作为常量放在全局范围内,而不是一遍又一遍地不断地输入字符串。它会减少头痛,组织更有条理,甚至可以帮助提高可扩展性。
但是,我会说,一般来说,如果可以的话,它是理想的(在你可能知道的所有编码语言中都可以看到),以避免全局变量。理想情况下,如果您不需要将其设为全局并保持本地化,那么您应该这样做。如果你发现自己传递一个变量或者一遍又一遍地使用一个不会改变的常量,那么也可以将它放在一个变量中。
底线:你不需要改变你的方式。实际上我打赌你很多JS开发人员没有这些好习惯的原因是因为javascript的灵活性。我敢肯定,如果很多JS开发人员都学习Java或C作为他们的第一语言,他们也会有这些好习惯。
答案 3 :(得分:0)
因为您必须在全局/集群范围中添加变量events
。
但是在javascript中你应该始终将变量保留在本地范围内,因为这样会快得多。