在JavaScript中是否有使用常量的方法?
如果没有,指定用作常量的变量的常见做法是什么?
const
的概念:const MY_CONSTANT = "some-value";
这将在除了IE 8、9和10之外的几乎所有浏览器中起作用。有些浏览器可能还需要启用严格模式。
您可以使用var
与类似ALL_CAPS的约定,以显示某些值不应被修改,如果您需要支持旧版浏览器或使用遗留代码:
var MY_CONSTANT = "some-value";
Object.defineProperty
来创建既是只读属性又不能被删除的属性。这在所有主要浏览器的最新版本中都有效(但在IE8中有异常,详见@NotAName的回答)。 - Phrogzconst
关键字现已正式成为该语言的一部分,并得到了所有浏览器的支持。根据 statcounter.com 的数据,只有少数几个百分点的互联网用户使用不支持 const
的旧版浏览器。 - twhb您是否试图保护变量免受修改?如果是,那么您可以使用模块模式:
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()方法 :(。
如果不需要严格保护变量的值,那么只需按建议使用全大写的约定即可。
CONFIG.get = someNewFunctionThatBreaksTheCode
。 - Thomas Edingprivate
是JavaScript中的未来保留字,如果我是你就不会使用它。 - Zaqconst
关键字在ECMAScript 6草案中出现,但截至2015年8月8日,只有少数浏览器支持它。请参考此ES6兼容性表以了解当前状态。语法如下:
const CONSTANT_NAME = 0;
const
赋值,它不会抛出任何错误。赋值操作只是失败了,常量仍然保持原来的值。在我看来,这是一个主要的设计缺陷,但只要有一个清晰、一致的命名约定(比如流行的全大写),我认为它不会带来太多麻烦。 - Tyler"use strict";
var constants = Object.freeze({
"π": 3.141592653589793 ,
"e": 2.718281828459045 ,
"i": Math.sqrt(-1)
});
constants.π; // -> 3.141592653589793
constants.π = 3; // -> TypeError: Cannot assign to read only property 'π' …
constants.π; // -> 3.141592653589793
delete constants.π; // -> TypeError: Unable to delete property.
constants.π; // -> 3.141592653589793
请查看Object.freeze。如果您想将 constants
引用也设置为只读,可以使用 const
。
"use strict";
是什么作用? - CadoizIE确实支持常量,有点像这样:
<script language="VBScript">
Const IE_CONST = True
</script>
<script type="text/javascript">
if (typeof TEST_CONST == 'undefined') {
const IE_CONST = false;
}
alert(IE_CONST);
</script>
const
)。你能解释一下它有什么问题吗? - Andrew GrimmECMAScript 5 引入了Object.defineProperty
:
Object.defineProperty (window,'CONSTANT',{ value : 5, writable: false });
这在每个现代浏览器中都是支持的(包括IE ≥ 9)。
writable: false
的属性进行赋值实际上会抛出错误。这是写入 'use strict'
到你的代码中的另一个原因。 - Cory Gross不,一般而言不支持。Firefox 实现了 const
,但我知道 IE 不支持。
@John 指出了一个常见的 const 命名惯例,在其他语言中已经使用了多年,我认为你完全可以采用这种方式。当然,这并不意味着某个人不会覆盖变量的值。 :)
Mozilla的MDN Web文档提供了有关const
的良好示例和解释。摘录:
// define MY_FAV as a constant and give it the value 7
const MY_FAV = 7;
// this will throw an error - Uncaught TypeError: Assignment to constant variable.
MY_FAV = 20;
但是令人遗憾的是,IE9/10仍然不支持const
。原因是荒谬的:
他们不实现它是因为其他浏览器没有正确实现它?!太害怕使它变得更好了?无论是否有标准定义,常量始终是常量:设置一次,永不改变。那么,IE9对const做了什么? 到目前为止,我们的决定是不支持它。 它还没有成为共识特性,因为并不是所有浏览器都支持它。
...
最终,似乎最好的长期解决方案是不要将其包含进来,并等待标准化进程的完成。
var
或function(){return}
之间没有区别。 const
才是唯一真正的常量。const
:
IE11包括对新出现的ECMAScript 6标准的定义良好且常用功能的支持,包括let、
const
、Map、Set和WeakMap,以及__proto__
以改进互操作性。
在JavaScript中,我的偏好是使用函数来返回常量值。
function MY_CONSTANT() {
return "some-value";
}
alert(MY_CONSTANT());
MY_CONSTANT = function() { return "some-other-value"; }
这段代码会导致问题。不过总体而言,这是个不错且快速的解决方案,点赞。 - Patrick M使用“新”Object API,您可以像这样做:
var obj = {};
Object.defineProperty(obj, 'CONSTANT', {
configurable: false
enumerable: true,
writable: false,
value: "your constant value"
});
请看这个链接,了解更多具体信息。它不是一级变量,因为它附加在对象上,但如果有作用域,任何东西都可以附加到其中。this
同样有效。
例如,在全局范围内执行此操作将在窗口上声明伪常量值(这是一个非常糟糕的想法,您不应该轻率地声明全局变量)。
Object.defineProperty(this, 'constant', {
enumerable: true,
writable: false,
value: 7,
configurable: false
});
> constant
=> 7
> constant = 5
=> 7
注意:赋值操作会在控制台中返回被赋的值,但变量的实际值并未改变。
const
或var
又有什么意义呢? - Codererconst
与var
具有相同的范围,即函数级别而不是块级别。但是,如果按照即将推出的ECMAScript标准来实现,const
与let
具有相同的范围,这意味着它将不起作用。 - Jasperconst var
和const let
... - cwharris