在Java中,我认为无论何时在多个地方使用字符串文字并期望它们匹配,都用常量变量替换字符串文字是最佳做法。例如,如果您要设置一个cookie,然后稍后再将其读回,那么cookie的名称应该是一个常量,这样编译器就可以帮助您发现拼写错误,更不用说允许您拥有一个可读的变量名称与String的实际值。
我正在审查JavaScript中的一些类似代码,我倾向于建议用常量替换文本。然而,我不确定同样的原因是否适用,因为没有编译器,cookie名称和变量名称一样具有描述性。
编辑:关于到目前为止收到的评论和回复,我肯定更关心常量的使用,而不是它们的实际实现方式。我在Java和其他编译语言中看到了它们的值,以此来防止错误,但我不确定在Javascript中看到了相同的值。
作为一种文档机制,比如说幻数,我认为拥有一个命名变量(即使它不是强制的常量)仍然是提高可读性的好方法。但对于字符串文字,我不确定这一点:
var trackingCookieName = "trackingCookie";
比只使用"trackingCookie"要好,因为你可以输入文字或变量名,无论哪种方式,它都只能在运行时被捕获。
将字符串文字提取为常量意味着
- 像JSHint这样的工具可以识别拼写错误的变量名
- 压缩机可以缩写变量名称以获得较小的输出
- 只需在一个位置更改字符串值
答案是主观的正如您所写的,没有编译器或常量。
因此,如果字符串存储在变量中,它有助于您阅读和维护代码,请执行它,否则请避免它…
Javascript const没有得到广泛支持,所以我会说No,这不是最佳实践。
"const的当前实现是Mozilla特定的扩展,不是ECMAScript 5的一部分。它在Firefox&Chrome(V8),Opera 9+和Safari部分支持。它在Internet Explorer 6-9或Internet Explorer 10的预览中不受支持。const关键字当前在函数作用域中声明常量(就像用var声明的变量一样)。
const将由ECMAScript 6定义,但具有不同的语义。与用let语句声明的变量类似,用const声明的常量将是块范围的。"-https://developer.mozilla.org/en/JavaScript/Reference/Statements/const
此外,如果您想在javascript中实现一个真正的const,那么将其封装在一个对象中,只提供get功能。
类似这样的东西:
var Cookies = (function()
{
var consts =
{
'APPLICATION': '21930857a3e',
'SERVER': '435a3456jh5'
};
return
{
get: function(name)
{
return consts [name];
}
};
}
)();
然后取回它们:
document.write('<img src="' + Cookies.get('APPLICATION') + '" />')
或者您希望使用常量的方式。
我同意gdoron的说法,他说这是主观的,事实上,我们称之为编程语言的约定,实际上是开发人员之间的一致意见,即从他们的角度来看,代码将如何更清晰、更容易维护等等。
我带来了"约定"的东西,因为这个"const"的东西几乎就是关于它的,有些人/组织经常使用这些语言,并为它们定义了一些好的实践。你可以用更适合你的方式使用这些约定,因为它们之间略有不同,所以你可以随着经验的积累而适应。它们在这里:
谷歌风格指南
JS Crockford风格指南
好吧,我同意这可能是主观选择。以下是我倾向于在JavaScript中使用等效于常量的东西的原因。首先,以下是我如何定义常数(或者这些更像ENUM):
function ENUM(name) {
window[name] = name; // depending on platform I am on
}
然后,在全局范围内,可能在某个文件中,我进行
ENUM("MSG_DOOR_OPEN");
ENUM("MSG_DOOR_CLOSED");
而且,我在我的代码中使用这个,比如:
obj.notify(MSG_DOOR_OPEN);
我更喜欢这个的原因是:
- 如果我拼错了什么,我会得到一些未定义的引用错误,这使得在任何JavaScript控制台中都很容易发现
- 通过这种方式,我指的是预先分配的字符串对象,而不是创建新的字符串对象
- 我不必引用这句话——看起来更好,尤其是在vim中
不利因素:
- 是的,这是一个全局变量
- 没有名称间隔(除了MSG_前缀)
- 如果你想对所有事情都这样做,那就太麻烦了。(你不必)
但对于消息名称等重要的事情,我喜欢这样做。此外,将所有消息名称定义在一个位置无论如何都是好的。我不是JavaScript专家,所以如果我错了,请纠正我。。。
在JavaScript中关于常量的争论中,我个人更喜欢下面的方法(实际上更接近enums)。
var DIR = {
North: [-1, 0],
NorthEast: [-1, 1],
East: [0, 1],
SouthEast: [1, 1],
South: [1, 0],
SouthWest: [1, -1],
West: [0, -1],
NorthWest: [-1, -1]
};
这使得它很容易使用,比如:
var myDirection = DIR.SouthEast;
此外,现代IDE可以为真正有帮助的值提供Intellisense
。
@Travis-J提到的另一个方法很好,很多框架都使用它(Sencha等)。但对于JS中接近常量或枚举的方法,我更喜欢上面的方法。
但你当然可以像Travis提到的那样:
var Directions = (function() {
var consts = {
'North': [-1, 0],
'NorthEast': [-1, 1],
'East': [0, 1],
'SouthEast': [1, 1],
'South': [1, 0],
'SouthWest': [1, -1],
'West': [0, -1],
'NorthWest': [-1, -1]
};
return {
get: function(name) {
return consts[name];
}
}
})();
但我的问题是,现在你必须知道正确的密钥。
var myDirection = Directions.get('SouthEast');
var myDirection = Directions.get('SOUTHEAST'); // null
希望能提供一点帮助。
无论语言如何,使用常量总是更好的(好吧,也许你可以找到一个好的例外)。我使用字符串文字的唯一时间是如果我正在制作文件解析器,或者如果我时间紧迫,不想制作常量列表。
当然,太多的常数可能更难读取。。。这实际上取决于字符串文字的模糊程度。
无论如何,Javascript是一种重字符串的语言(就像任何解释语言一样)。您可以根据对象的字符串名称(container["innerObject"]
)从对象中提取字段,而且通过字符串运行代码几乎太容易了。