在Javascript中将字符串文本提取为常量是一种最佳实践吗

Is it a best practice to extract String literals to constants in Javascript?

本文关键字:一种 最佳 Javascript 字符串 文本 常量 提取      更新时间:2023-09-26

在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);

我更喜欢这个的原因是:

  1. 如果我拼错了什么,我会得到一些未定义的引用错误,这使得在任何JavaScript控制台中都很容易发现
  2. 通过这种方式,我指的是预先分配的字符串对象,而不是创建新的字符串对象
  3. 我不必引用这句话——看起来更好,尤其是在vim中

不利因素:

  1. 是的,这是一个全局变量
  2. 没有名称间隔(除了MSG_前缀)
  3. 如果你想对所有事情都这样做,那就太麻烦了。(你不必)

但对于消息名称等重要的事情,我喜欢这样做。此外,将所有消息名称定义在一个位置无论如何都是好的。我不是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"])从对象中提取字段,而且通过字符串运行代码几乎太容易了。

相关文章: