【问题标题】:Is it a best practice to extract String literals to constants in Javascript?将字符串文字提取为 Javascript 中的常量是否是最佳实践?
【发布时间】:2012-03-17 23:34:01
【问题描述】:

在 Java 中,我认为将字符串文字替换为常量变量是一种最佳实践,只要它们在多个地方使用并期望匹配。例如,如果您要设置一个 cookie,然后再将其读回,则 cookie 的名称应该是一个常量,以便编译器可以帮助您捕获拼写错误,更不用说允许您拥有一个可读的变量名与字符串的实际值相比。

我正在审查 JavaScript 中的一些类似代码,我倾向于建议将文字替换为常量。但是,我不确定是否适用相同的原因,因为没有编译器,并且 cookie 名称与变量名称一样具有描述性。

编辑:与到目前为止收到的 cmets 和响应有关,我肯定更关心常量的使用而不是它们的实际实现方式。我将它们在 Java 和其他编译语言中的价值视为防止错误的一种方式,但我不确定我在 Javascript 中看到相同的价值。

作为一种文档机制,比如幻数,我认为拥有一个命名变量(即使它没有作为常量强制执行)仍然是提高可读性的好方法。但是对于字符串文字,我不确定:

var trackingCookieName = "trackingCookie";

比仅仅使用“trackingCookie”更好,因为你可以拼写文字或变量名,无论哪种方式,它只会在运行时被捕获。

【问题讨论】:

    标签: javascript constants


    【解决方案1】:

    将字符串字面量提取为常量意味着

    • JSHint 等工具可以识别拼写错误的变量名
    • 压缩器可以缩写变量名以获得更小的输出
    • 您只需在 1 个地方更改字符串值

    【讨论】:

      【解决方案2】:

      答案是主观的。正如您所写,没有编译器或常量。

      因此,如果字符串存储在变量中有助于您阅读和维护代码,请执行此操作,否则请避免使用它...

      【讨论】:

      • 同意。我要补充一点,随着字符串文字数量的增加,使用常量可能会更好。如果出现拼写错误,您可能会收到一个 ReferenceError,这将使调试变得更加容易。
      【解决方案3】:

      Javascript const 没有得到广泛支持,所以我会说不,这不是最佳实践。

      “当前的 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') + '" />')
      

      或者您希望使用常量。

      【讨论】:

      • @JeffreySweeney - 也许我读错了,我将I'm inclined to recommend that the literals be replaced with a constant 解释为将字符串设置为const,所以这就是我的回应。
      【解决方案4】:

      我同意 gdoron 的观点,他说它是主观的,事实上,我们称之为编程语言的约定实际上是开发人员之间就他们的观点如何使代码更清晰、更易于维护等达成的共识。

      我带来了“约定”的东西,因为“const”的东西几乎就是它,而且有些人/组织经常使用这些语言并为他们定义了一些好的做法。您可以以更适合您的方式使用这些约定,因为它们之间略有不同,因此您可以根据经验进行调整。他们在这里:

      Google Style Guide

      JS Crockford Style Guide

      【讨论】:

      • 感谢您的链接。不幸的是,我没有看到其中任何一个解决了字符串文字与常量的问题。 Google 文档鼓励将 CONSTANT_VARIABLES 用于幻数,这是有道理的,但在其他情况下它是沉默的。听起来我的问题的答案是,“不,没有关于字符串文字与命名常量的最佳实践”
      【解决方案5】:

      好的,我同意这可能是主观选择。以下是我偏向于在 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. 如果你想对所有事情都这样做,这很麻烦。 (你不必)

      但是对于消息名称等重要的事情,我喜欢这样做。此外,将所有消息名称定义在 1 个位置无论如何都很好。我不是JavaScript专家或任何东西,所以如果我错了,请纠正我......

      【讨论】:

        【解决方案6】:

        在 JavaScript 中关于常量的争论中,我个人更喜欢下面的方法(确实更接近枚举)。

        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
        

        希望能提供一点帮助。

        【讨论】:

          【解决方案7】:

          不管是什么语言,使用常量总是更好的(好吧,也许你可以找到一个很好的例外)。我唯一使用字符串文字的情况是,如果我正在制作文件解析器,或者我的时间不够,不想制作常量列表。

          当然,太多的常量会更难阅读……这真的取决于字符串文字的晦涩程度。

          无论如何,Javascript 是一种重字符串的语言(就像任何解释语言一样)。您可以根据对象的字符串名称 (container["innerObject"]) 从对象中提取字段,并且通过字符串运行代码几乎太容易了。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-11-10
            • 1970-01-01
            • 2014-01-23
            • 1970-01-01
            • 1970-01-01
            • 2016-01-03
            • 1970-01-01
            相关资源
            最近更新 更多