有没有办法在JavaScript中使用常量?
如果没有,指定用作常量的变量的常见做法是什么?
有没有办法在JavaScript中使用常量?
如果没有,指定用作常量的变量的常见做法是什么?
Rhino.js
工具const
除了什么如上所述。
另一种替代方法是:
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"
将保持不变。
在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”属性保留了其原始值。您已经为自己设置了一些不错的“绿色”临时常量...
但是,当然,这只能防止您通过直接访问意外地修改,更改,无效或清空属性常量值,如给定示例所示。
否则我仍然认为常量是假的。我仍然认为,将自己的巨大自由换成一小部分欺骗性安全保障是最糟糕的交易。
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
无论如何都要遵循所有声明是一个好习惯,因此请仅依赖它。
在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"
便会立即清楚。
我在Greasemonkey脚本中使用const
而不是var
,但是,因为它们只能在Firefox上运行...
名称约定也确实是可行的方式(我俩都做!)。
我的意见(仅适用于对象)。
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;
忘记IE并使用const
关键字。
如果您不介意使用函数:
var constant = function(val) {
return function() {
return val;
}
}
这种方法为您提供函数而不是常规变量,但可以保证*设置值后,任何人都无法更改。
a = constant(10);
a(); // 10
b = constant(20);
b(); // 20
我个人觉得这很令人愉快,特别是在从可观察的观测器适应了这种模式之后。
*除非有人constant
在您调用它之前重新定义了该函数
不,不是一般。Firefox实现了,const
但我知道IE没有。
@John指出了一种在其他语言上已经使用了多年的const的通用命名惯例,我认为没有理由不能使用它。当然,这并不意味着某人无论如何也不会覆盖变量的值。:)
在JavaScript中,我的首选是使用函数返回常量值。
function MY_CONSTANT() {
return "some-value";
}
alert(MY_CONSTANT());
从ES2015开始,JavaScript的概念是const
:
const MY_CONSTANT = "some-value";
这几乎可以在除IE 8、9和10之外的所有浏览器中使用。有些可能还需要启用严格模式。
您可以var
与ALL_CAPS之类的约定一起使用,以表明如果您需要支持旧版浏览器或正在使用旧版代码,则不应修改某些值:
var MY_CONSTANT = "some-value";
该const
关键字是ECMAScript的第6条草案,但迄今只享受的浏览器支持一知半解:http://kangax.github.io/compat-table/es6/。语法为:
const CONSTANT_NAME = 0;
关键字“ const”是较早提出的,现在已正式包含在ES6中。通过使用const关键字,您可以传递将用作不可变字符串的值/字符串。