【问题标题】:How to declare string constants in JavaScript? [duplicate]如何在 JavaScript 中声明字符串常量? [复制]
【发布时间】:2011-08-12 18:21:23
【问题描述】:

我想在 JavaScript 中声明字符串常量。

有没有办法做到这一点?

【问题讨论】:

标签: javascript constants


【解决方案1】:

许多浏览器的实现(和 Node)都有常量,与 const 一起使用。

const SOME_VALUE = "Your string";

这个const 意味着您不能将它重新分配给任何其他值。

检查compatibility notes 以查看您的目标浏览器是否受支持。

或者,您也可以修改第一个示例,使用defineProperty() 或其朋友,并将writable 属性设为false。这意味着变量的内容不能像常量一样改变。

【讨论】:

  • 好主意。您可以通过在属性名称周围不使用' 来进一步节省一些击键,例如= { constant1: 'value1',}
  • 非常感谢这个答案。我本来打算使用 const 但不幸的是,我们仍然支持使用 ie9 的用户 :( 一件奇怪的事情是在 MDN 页面上,它说它可以是“数据描述符”或“访问器描述符”,但不能两者兼而有之……但是示例显示它们都被使用(即:可写可枚举)然后在“defineProperties”上并没有这么说,让你使用任何......有点混乱。
  • 此外,用下划线以大写形式命名常量是一种很好的做法,以表明它们的特殊用途。例如const SOME_VAR = "Your string";
  • @Sven31415 好主意,进行了编辑。
【解决方案2】:

使用全局命名空间或全局对象,如常量。

var Constants = {};

并使用defineObject编写函数将所有属性添加到该对象并为其赋值。

function createConstant (prop, value) {
    Object.defineProperty(Constants , prop, {
      value: value,
      writable: false
   });
};

【讨论】:

  • 这是在 ES5 中创建常量的方法,在 ES6 中我们有新的关键字 const 来做。
【解决方案3】:

从 ECMAScript 2015(又名 ES6)开始,您可以使用 const

const constantString = 'Hello';

但并非所有浏览器/服务器都支持这一点。为了支持这一点,请使用像 Babel 这样的 polyfill 库。

【讨论】:

  • 谷歌浏览器支持常量
【解决方案4】:

你可以使用 Object 的 freeze 方法来创建一个常量。例如:

var configObj ={timeOut :36000};
Object.freeze(configObj);

这样你不能改变configObj。

【讨论】:

    【解决方案5】:

    当然,当 OP 提交问题时,这不是一个选项,但 ECMAScript 6 现在还允许通过“const”关键字的方式使用常量:

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const

    您可以看到 ECMAScript 6 采用 here

    【讨论】:

      【解决方案6】:

      JavaScript 中没有常量,但要声明一个字面量,您所要做的就是:

      var myString = "Hello World";
      

      我不确定您将它们存储在资源文件中是什么意思;这不是 JavaScript 概念。

      【讨论】:

        【解决方案7】:

        内置 Object 的标准冻结功能可用于冻结包含常量的对象。

        var obj = {
            constant_1 : 'value_1'
        };
        Object.freeze(obj);
        obj.constant_1 = 'value_2';   //Silently does nothing
        obj.constant_2 = 'value_3';   //Silently does nothing
        

        在严格模式下,在不可变对象上设置值会引发 TypeError。更多详情请见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze

        【讨论】:

          【解决方案8】:

          好吧,你可以这样做:

          (function() {
              var localByaka;
              Object.defineProperty(window, 'Byaka', {
                  get: function() {
                      return localByaka;
                  },
                  set: function(val) {
                      localByaka = window.Byaka || val;
                  }
              });
          }());
          window.Byaka = "foo"; //set constant
          window.Byaka = "bar"; // try resetting it for shits and giggles
          window.Byaka; // will allways return foo!
          

          如果您在全局范围内执行上述操作,这将是一个真正的常量,因为您无法覆盖窗口对象。

          我创建了一个库来在 javascript 中创建常量和不可变对象。它仍然是 0.2 版,但它做得很好。 http://beckafly.github.io/insulatejs

          【讨论】:

            【解决方案9】:

            给这只猫剥皮的方法有很多。您可以在闭包中执行此操作。此代码将为您提供一种只读的、命名空间的方式来获取常量。只需在 Public 区域中声明它们即可。

            //Namespaced Constants
            var MyAppName;
            //MyAppName Namespace
            (function (MyAppName) {
                //MyAppName.Constants Namespace
                (function (Constants) {
                    //Private
                    function createConstant(name, val) {
                        Object.defineProperty(MyAppName.Constants, name, {
                            value: val,
                            writable: false
                        });
                    }
            
                    //Public
                    Constants.FOO = createConstant("FOO", 1);
                    Constants.FOO2 = createConstant("FOO2", 1);
            
                    MyAppName.Constants = Constants;
                })(MyAppName.Constants || (MyAppName.Constants = {}));
            })(MyAppName || (MyAppName = {}));
            

            用法:

            console.log(MyAppName.Constants.FOO);       //prints 1
            MyAppName.Constants.FOO = 2;
            console.log(MyAppName.Constants.FOO);       //does not change - still prints 1
            

            【讨论】:

            • 此解决方案的一个问题是您可以重新定义父对象。 MyAppName.Constants = null;控制台.log(MyAppName.Constants.FOO); //会报错
            • @Byaxy,这是正确的。您建议的解决方案对于提供实际的“常数”更为准确。我喜欢我建议的方法的原因是它减少了 DOM 的混乱并以更有条理的方式使用“常量”(大写和命名空间)。所有这些都是为了使某些东西在一种本机不支持它的语言中工作。啊,JavaScript 的乐趣。 =p
            【解决方案10】:

            你在使用 JQuery 吗?您想在多个 javascript 文件中使用常量吗?然后继续阅读。 (这是我对相关 JQuery 问题的回答)

            有一个方便的 jQuery 方法称为“getScript”。确保使用与从 html/jsp/etc 文件访问文件时相同的相对路径(即,该路径不是相对于您放置 getScript 方法的位置,而是相对于您的域路径)。例如,对于 localhost:8080/myDomain 的应用程序:

            $(document).ready(function() {
              $.getScript('/myDomain/myScriptsDir/constants.js');
              ...
            

            那么,如果你在一个名为 constants.js 的文件中有这个:

            var jsEnum = { //not really an enum, just an object that serves a similar purpose
              FOO : "foofoo",
              BAR : "barbar",
            }
            

            您现在可以使用

            打印出 'foofoo'
            jsEnum.FOO
            

            【讨论】:

            • 是的,但你也可以这样做:jsEnum.FOO = "booboo"。不是常数。
            【解决方案11】:

            只需声明任何 js 函数范围之外的变量。此类变量将是全局变量。

            【讨论】:

            • 全局变量使全局命名空间变得混乱,并导致不必要的问题。
            • 您还会如何处理“在页面上声明”?我可以“发明”的唯一解释是全局变量。
            • 全局变量不是常量——可以修改。
            猜你喜欢
            • 2010-11-28
            • 1970-01-01
            • 2020-07-31
            • 1970-01-01
            • 2015-05-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-02
            相关资源
            最近更新 更多