在JavaScript中有使用常量的方法吗?
如果不是,指定用作常量的变量的常见做法是什么?
在JavaScript中有使用常量的方法吗?
如果不是,指定用作常量的变量的常见做法是什么?
当前回答
您是否试图保护变量不被修改?如果是,那么你可以使用模块模式:
var CONFIG = (function() {
var private = {
'MY_CONST': '1',
'ANOTHER_CONST': '2'
};
return {
get: function(name) { return private[name]; }
};
})();
alert('MY_CONST: ' + CONFIG.get('MY_CONST')); // 1
CONFIG.MY_CONST = '2';
alert('MY_CONST: ' + CONFIG.get('MY_CONST')); // 1
CONFIG.private.MY_CONST = '2'; // error
alert('MY_CONST: ' + CONFIG.get('MY_CONST')); // 1
使用这种方法,不能修改值。但是,你必须在CONFIG:(上使用get()方法。
如果您不需要严格保护变量值,那么只需按照建议执行并使用ALL CAPS约定即可。
其他回答
JavaScript ES6(重新)引入了所有主流浏览器都支持的const关键字。
通过const声明的变量不能被重新声明或重新赋值。
除此之外,const的行为类似于let。
对于基本数据类型(Boolean, Null, Undefined, Number, String, Symbol),它的行为与预期一样:
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声明来说,这都是一个很好的约定,所以只需依赖它即可。
如果你不介意使用函数:
var constant = function(val) {
return function() {
return val;
}
}
这种方法为您提供函数而不是常规变量,但它保证一旦设置了值,就没有人可以更改值。
a = constant(10);
a(); // 10
b = constant(20);
b(); // 20
我个人觉得这相当令人愉快,特别是在我已经习惯了这种模式之后。
*除非有人在你调用函数常量之前重新定义了它
您可以轻松地为脚本配备一种用于常量的机制,这些常量可以设置但不能更改。试图更改它们将产生错误。
/* author Keith Evetts 2009 License: LGPL
anonymous function sets up:
global function SETCONST (String name, mixed value)
global function CONST (String name)
constants once set may not be altered - console error is generated
they are retrieved as CONST(name)
the object holding the constants is private and cannot be accessed from the outer script directly, only through the setter and getter provided
*/
(function(){
var constants = {};
self.SETCONST = function(name,value) {
if (typeof name !== 'string') { throw new Error('constant name is not a string'); }
if (!value) { throw new Error(' no value supplied for constant ' + name); }
else if ((name in constants) ) { throw new Error('constant ' + name + ' is already defined'); }
else {
constants[name] = value;
return true;
}
};
self.CONST = function(name) {
if (typeof name !== 'string') { throw new Error('constant name is not a string'); }
if ( name in constants ) { return constants[name]; }
else { throw new Error('constant ' + name + ' has not been defined'); }
};
}())
// ------------- demo ----------------------------
SETCONST( 'VAT', 0.175 );
alert( CONST('VAT') );
//try to alter the value of VAT
try{
SETCONST( 'VAT', 0.22 );
} catch ( exc ) {
alert (exc.message);
}
//check old value of VAT remains
alert( CONST('VAT') );
// try to get at constants object directly
constants['DODO'] = "dead bird"; // error
我在Greasemonkey脚本中使用const而不是var,但这是因为它们只会在Firefox上运行… 名称约定也确实是可行的方法(我两者都做!)
在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"时,你马上就明白了。