题 JavaScript中是否有常量?


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

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


1061
2017-09-24 22:45


起源


Chrome 允许您使用关键字 const 使用常量。例如 const ASDF = "asdf"。但是,自从 const 不是多浏览器兼容,我通常坚持一个 var 宣言。 - Jacksonkr
try{const thing=1091;}catch(e){var thing=1091;} 作品。 - Derek 朕會功夫
Derek:你的try / catch不会限制你向try / catch块声明的东西的范围吗?如果你没有正确确定范围,那么具体要点是什么 const 要么 var 在所有? - Coderer
@Coderer在当前的实现中,这将起作用 const 与...具有相同的范围 var,这是功能级别,而不是块级别。如果您遵循即将推出的ECMAScript标准, const 与...具有相同的范围 let,这意味着它不会起作用。 - Jasper
@Coderer错误的语言。 javascript中的变量是函数范围。这不是C. - doug65536


答案:


以来 ES2015,JavaScript有一个概念 const

const MY_CONSTANT = "some-value";

这将有效 几乎所有的浏览器,除了IE 8,9和10。有些人可能也需要 严格的模式 启用。

您可以使用 var 使用ALL_CAPS等约定来显示如果您需要支持旧浏览器或使用旧代码,则不应修改某些值:

var MY_CONSTANT = "some-value";

966
2017-09-24 22:46



const x = 24怎么样; - Zachary Scott
请注意,如果您不需要跨浏览器兼容性(或者您在Rhino或Node.js中进行服务器端编程),则可以使用 const 关键词。目前除了IE之外,所有现代浏览器都支持它。 - Husky
这些天(3。5年后)你可以使用 Object.defineProperty 创建也无法删除的只读属性。这适用于所有主流浏览器的当前版本(但是 在IE8中不正确)。请参阅@NotAName的答案 - Phrogz
@Amyth那不是很有帮助。这是一种风格 指南 由独家供应商提出。根据赫斯基的观点,在编写服务器端JS时,IE兼容性完全无关紧要。 - aendrew
由于谷歌在2015年的答案仍然排名很高,应该说它现在已经过时了。该 const 关键字现在正式成为该语言的一部分,并得到每个浏览器的支持。根据statcounter.com,只有百分之几的互联网用户仍然使用不支持的旧浏览器版本 const。 - Tristan Berger


您是否试图保护变量不被修改?如果是这样,那么您可以使用模块模式:

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约定。


304
2017-09-25 03:14



请注意,您只需返回CONFIG值的函数即可。这样可以节省你一直调用CONFIG.get()的时间。 - Mathew Byrne
漂亮的解决方但是这些东西应该被包装成一个库,不要在任何新项目中重新发明它们。 - Anders D
CONFIG.get = someNewFunctionThatBreaksTheCode...总而言之,你绝对不能在JS(w / o const关键字)中强制执行常量。你唯一能做的就是限制能见度。 - Thomas Eding
我确实相信 private 是JavaScript中未来的保留字,如果我是你,我不会使用它。 - Zaq
这也是注册表模式。


const 关键字在 ECMAScript 6草案 但到目前为止,它只享受一些浏览器支持: http://kangax.github.io/compat-table/es6/。语法是:

const CONSTANT_NAME = 0;

119
2018-03-26 20:29



如果您尝试为a分配值 const,它不会抛出任何错误。赋值失败,常量仍然具有原始值。这是一个主要的设计缺陷恕我直言,但只要有一个明确,一致的命名约定(如流行的ALL_CAPS),我不认为这会导致太多的悲伤。 - MatrixFrog
请关注浏览器支持: kangax.github.io/es5-compat-table/es6/#const - Mark McDonald
@MatrixFrog赋值会引发错误 'use strict'。 - sam
我应该定义常量吗? ALL CAPS? - Lewis
@Tresdin在所有大写字母中定义常量是一种常见的命名约定。语言规范中没有任何内容强制它,但这不是一个坏主意。它使您的意图更清晰,因此它提高了代码的可读性。 - Bill the Lizard


"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。您可以 使用 const 如果你想做的话 constants 参考也是只读的。


64
2018-05-04 23:58



应该提到这只适用于IE9 + kangax.github.io/compat-table/es5 。 - Cordle
如果没有破碎的实施,我会的 i - Alnitak
注意:此行为与ES6类似 const 声明,例如属性不能重新声明或重新分配,但如果它们是数据类型 object,他们可以变异。 - le_m
正是我在寻找什么。你也可以使用 const constants 代替 var constants 防止变量被重新分配。 - Jarett Millard
参见,例如, 深度冻结 用于递归冻结。 - sam


IE确实支持常量,例如:

<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>

63
2017-10-26 19:22



男孩,谈论不是跨浏览器的事情。 。 。在开箱即用的时候还是+1。 - Tom
VBScript的?那是什么? ;) - tybro0103
我通常使用IE特定的答案向一般相关的跨浏览器问题投票。因为我讨厌那些认为IE javascript实现是“一个”的人,而其他人只是被忽略了。谁比IE使用其他的borwsers,顺便说一下? - Ant
可能在ES6中: wiki.ecmascript.org/doku.php?id=harmony:const - Ciro Santilli 新疆改造中心 六四事件 法轮功
@Cooluhuru这个脚本似乎可以处理IE浏览器(使用VBScript)和非IE浏览器(使用JavaScript) const)。你能解释一下它有什么问题吗? - Andrew Grimm


ECMAScript 5确实介绍了 Object.defineProperty

Object.defineProperty (window,'CONSTANT',{ value : 5, writable: false });

它的 每个现代浏览器都支持 (以及IE≥9)。

也可以看看: ES5中的Object.defineProperty?


57
2018-01-09 00:41



值得注意的是,这不像传统的常数。这只允许您定义一个常量属性(非常量对象)。此外,这不会生成错误,甚至会返回您尝试设置的值。它根本不写值。 - Cory Gross
我最近读到试图分配给一个属性 writable: false  将 如果在ECMAScript 5的严格模式下解释执行赋值的代码,则实际抛出错误。写作的另一个原因 'use strict' 进入你的代码。 - Cory Gross
你实际上可以省略 writable: false 因为那是 默认。 - sam


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


@约翰 指出在其他语言中使用多年的竞争的常见命名实践,我认为没有理由不能使用它。当然,这并不意味着有人不会写出变量的值。 :)


24
2017-09-24 22:45



众所周知,如果IE没有实现它,它可能也不存在。 - Josh Hinman
不幸的是,实际上 - 这是事实。 IE确实占有很大的市场份额。如果我拥有一家企业并且内部使用了Web应用程序,那么我会对FF进行标准化。我不知道为什么这么多人关心IE,它会受到打击。 - Jason Bunting
@Rich:谁说我的意见是事实?你做了很多假设。此外,就我而言,IE糟透了这一事实。你可以拥有自己的事实,我没有说你必须相信我的。 :P拿一个Xanax或者其他东西...... - Jason Bunting
@Rich B,是的,这只是一个愚蠢的评论,相信我,我会知道,我做了很多愚蠢的评论。 @Jason B. - 有趣的是,昨晚我遇到了这个问题.. const在FF工作但不是IE。谢谢你的澄清
谁在乎IE呢?我不! FF或Chrome或Opera等...几乎可以安装在每个OS平台上。此外,计算机零售商通常也知道旧的IE版本很糟糕,因此他们经常(甚至每次)在销售计算机之前安装其他浏览器。因此,我决定让我开发的应用程序完全不关心不兼容的浏览器:如果浏览器开发人员关心尊重标准,他们的产品可以使用我的应用程序,如果没有,用户将使用不同的浏览器...我可以忍受它; - )但微软能否在市场上失去一部分?不,他们不能这样“他们”会改变他们的政治! - willy wonka