JavaScript中有常量吗?

有没有办法在JavaScript中使用常量?

如果没有,指定用作常量的变量的常见做法是什么?

阳光神奇2020/03/09 23:07:19

关键字“ const”是较早提出的,现在已正式包含在ES6中。通过使用const关键字,您可以传递将用作不可变字符串的值/字符串。

西里神奇2020/03/09 23:07:19

Javascript中已经存在常量您可以这样定义一个常量:

const name1 = value;

这不能通过重新分配而改变。

JinJin阿飞2020/03/09 23:07:19

Rhino.js工具const除了什么如上所述。

猴子阳光2020/03/09 23:07:19

另一种替代方法是:

var constants = {
      MY_CONSTANT : "myconstant",
      SOMETHING_ELSE : 123
    }
  , constantMap = new function ConstantMap() {};

for(var c in constants) {
  !function(cKey) {
    Object.defineProperty(constantMap, cKey, {
      enumerable : true,
      get : function(name) { return constants[cKey]; }
    })
  }(c);
}

然后简单地: var foo = constantMap.MY_CONSTANT

如果您这样做,constantMap.MY_CONSTANT = "bar"那将是无效的,因为我们正在尝试将赋值运算符与getter一起使用,因此constantMap.MY_CONSTANT === "myconstant"将保持不变。

前端Harry十三2020/03/09 23:07:19

在JavaScript中引入常量充其量只是一种技巧。

在JavaScript中实现持久和可全局访问的值的一种好方法是声明一个带有一些“只读”属性的对象文字,如下所示:

            my={get constant1(){return "constant 1"},
                get constant2(){return "constant 2"},
                get constant3(){return "constant 3"},
                get constantN(){return "constant N"}
                }

您会将所有常量归为一个“我的”附件对象,您可以在其中查找存储的值或为此而决定放入其中的任何其他值。现在让我们测试一下是否可行:

           my.constant1; >> "constant 1" 
           my.constant1 = "new constant 1";
           my.constant1; >> "constant 1" 

如我们所见,“ my.constant1”属性保留了其原始值。您已经为自己设置了一些不错的“绿色”临时常量...

但是,当然,这只能防止您通过直接访问意外地修改,更改,无效或清空属性常量值,如给定示例所示。

否则我仍然认为常量是假的。我仍然认为,将自己的巨大自由换成一小部分欺骗性安全保障是最糟糕的交易。

MonsterKK梅2020/03/09 23:07:19

JavaScript ES6(重新)引入了所有主流浏览器都支持const关键字

通过声明的变量const无法重新声明或重新分配。

除此之外,其const行为类似于let

对于原始数据类型(布尔,空,未定义,数字,字符串,符号),它的行为符合预期:

const x = 1;
x = 2;
console.log(x); // 1 ...as expected, re-assigning fails

注意:请注意有关对象的陷阱:

const o = {x: 1};
o = {x: 2};
console.log(o); // {x: 1} ...as expected, re-assigning fails

o.x = 2;
console.log(o); // {x: 2} !!! const does not make objects immutable!

const a = [];
a = [1];
console.log(a); // 1 ...as expected, re-assigning fails

a.push(1);
console.log(a); // [1] !!! const does not make objects immutable

如果您确实需要一个不变且绝对恒定的对象:只需使用const ALL_CAPS即可使您的意图清楚。const无论如何都要遵循所有声明是一个好习惯,因此请仅依赖它。

番长Jim路易2020/03/09 23:07:19

在JavaScript中,我的实践是尽可能避免使用常量,而改用字符串。当您想将常量公开给外界时,会出现常量问题:

例如,可以实现以下Date API:

date.add(5, MyModule.Date.DAY).add(12, MyModule.Date.HOUR)

但是简单地写起来要短得多,更自然:

date.add(5, "days").add(12, "hours")

这样,“天”和“小时”实际上就像常量,因为您无法从外部更改“小时”表示多少秒。但是很容易覆盖MyModule.Date.HOUR

这种方法也将有助于调试。如果Firebug告诉您action === 18,很难理解其含义,但是当您看到时,action === "save"便会立即清楚。

小胖Green2020/03/09 23:07:19

在Greasemonkey脚本中使用const而不是var,但是,因为它们只能在Firefox上运行...
名称约定也确实是可行的方式(我俩都做!)。

古一十三2020/03/09 23:07:19

我的意见(仅适用于对象)。

var constants = (function(){
  var a = 9;

  //GLOBAL CONSTANT (through "return")
  window.__defineGetter__("GCONST", function(){
    return a;
  });

  //LOCAL CONSTANT
  return {
    get CONST(){
      return a;
    }
  }
})();

constants.CONST = 8; //9
alert(constants.CONST); //9

尝试!但是请理解-这是对象,而不是简单的变量。

也可以尝试:

const a = 9;
卡卡西卡卡西2020/03/09 23:07:19

忘记IE并使用const关键字。

十三小哥2020/03/09 23:07:19

如果您不介意使用函数:

var constant = function(val) {
   return function() {
        return val;
    }
}

这种方法为您提供函数而不是常规变量,但可以保证*设置值后,任何人都无法更改。

a = constant(10);

a(); // 10

b = constant(20);

b(); // 20

我个人觉得这很令人愉快,特别是在从可观察的观测器适应了这种模式之后。

*除非有人constant在您调用它之前重新定义了该函数

米亚小小神乐2020/03/09 23:07:19

不,不是一般。Firefox实现了,const但我知道IE没有。


@John指出了一种在其他语言上已经使用了多年的const的通用命名惯例,我认为没有理由不能使用它。当然,这并不意味着某人无论如何也不会覆盖变量的值。:)

Pro小卤蛋2020/03/09 23:07:19

在JavaScript中,我的首选是使用函数返回常量值。

function MY_CONSTANT() {
   return "some-value";
}


alert(MY_CONSTANT());
小小理查德2020/03/09 23:07:18

ES2015开始,JavaScript的概念是const

const MY_CONSTANT = "some-value";

几乎可以在除IE 8、9和10之外的所有浏览器中使用有些可能还需要启用严格模式

您可以var与ALL_CAPS之类的约定一起使用,以表明如果您需要支持旧版浏览器或正在使用旧版代码,则不应修改某些值:

var MY_CONSTANT = "some-value";
前端Harry十三2020/03/09 23:07:18

const关键字是ECMAScript的第6条草案,但迄今只享受的浏览器支持一知半解:http://kangax.github.io/compat-table/es6/语法为:

const CONSTANT_NAME = 0;