如果不是这样,对于指定用作常量的变量通常的做法是什么?

2008-09-24 22:45:05
问题评论:

Chrome可使用关键字const使用常量。const ASDF = "asdf"但是,由于const不多浏览器兼容,我通常坚持使用var声明。

try{const thing=1091;}catch(e){var thing=1091;}工作正常。

Derek: try/catch 岂不限制的范围声明到 try/catch 块的事情吗?如果您在不正常范围什么是所有指定constvar的点?

@Coderer 的当前实现中,这会起作用,因为const具有相同的作用域为var,并且属于函数级别、 不块级别。如果您执行的是即将到来的 ECMAScript 标准, constlet,这意味着它将不起作用一样的范围。

@Coderer 错误的语言。在 javascript 中的变量是函数作用域。这不是 c。

回答:

ES2015,最新版本的 javascript 具有const的概念.

const MY_CONSTANT = "some-value";

在几乎所有的浏览器,除了 IE 8,9 和 10 中工作可能还会需要严格的定义。

您可以使用像 ALL_CAPS 一样的约定,表明某些如果不编写 ES2015,不应修改的值。

var MY_CONSTANT = "some-value";

怎么样 const x = 24;

请注意,是否您不需要跨浏览器兼容性 (或者是服务器端编程 Node.js Rhino 中) 可以使用const关键字。它目前是除 IE 之外的所有现代浏览器支持。

这些天 (3.5 年后) 可以使用Object.defineProperty来创建只读属性,也不能被删除。这适用于所有主要的浏览器 (但在 IE8 中不正确) 的当前版本。通过 @NotAName 看到答案

不是真的有用的 @Amyth。它是风格指南建议的唯一供应商。按照上面的 Husky 的点,IE 兼容性是完全不相关时编写服务器端 JS。

由于此答案仍然高度排名由 Google 在 2015年它应该说现已过时。const关键字目前正式语言的一部分,并且每个浏览器都支持。根据 statcounter.com 仅几个百分点的互联网用户仍使用旧版本的浏览器不支持const.

您正在尝试保护避免修改变量吗?如果是这样,您可以使用模块模式︰

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

使用此方法,则不能修改的值。但是,您必须在配置上使用 get() 方法: (。

如果您不需要严格保护的变量值,然后只需按照建议做并使用全部大写字母的约定。

请注意,您只需返回的配置值的函数。该会保存您调用 CONFIG.get() 所有的时间。

完美的解决方案。但这类事情应包装为要不重塑其任何新建项目中的库。

CONFIG.get = someNewFunctionThatBreaksTheCode...总之,您绝对不能强制 JS 中 (不含 const 关键字) 的常量。几乎所能做的唯一事情是限制可见性。

我确实相信,private为将来保留的字在 JavaScript 中,如果您不使用的。

这也是该注册表模式。

const关键字中ECMAScript 6 草稿,但它到目前为止只喜欢的浏览器支持 smattering: http://kangax.github.io/compat-table/es6/语法是︰

const CONSTANT_NAME = 0;

如果您尝试将一个值分配给const,它不会引发任何错误。分配只是失败和常量仍有其原始值。这是 IMHO 的一个主要的设计缺陷,但只要没有清晰、 一致的命名约定 (如流行的 ALL_CAPS) 我并不认为这会导致太多的麻烦。

这里的浏览器支持,请时刻关注︰ kangax.github.io/es5-compat-table/es6/#const

@MatrixFrog 赋值会引发错误'use strict'.

应该在ALL CAPS定义常量?

@Tresdin 是通用命名约定来定义常量中全部大写。语言规范中的任何内容将其强制转换,但它不是个好主意。它使清楚您的意图是什么,因此它可以提高代码的可读性。

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>

伙计,事情不是跨浏览器的讨论...仍 + 1 位在框外思考的。

VBScript 吗?什么?;)

我通常投票常规相关的跨浏览器问题,IE 的特定答案。我不喜欢的人认为,IE javascript 实现是 ',而其他人都只是被忽略的原因。顺便说一下,谁在使用 IE,比其他 borwsers?

可能在 ES6: wiki.ecmascript.org/doku.php?id=harmony:const

此脚本将显示处理 (使用 VBScript) 的 IE 浏览器和非 IE 浏览器 (使用 JavaScript const) @Cooluhuru。您能解释一下什么是错误的?

ECMAScript 5 会带来Object.defineProperty :

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

但在此时刻大多不支持它。

另请参见︰在 ES5 Object.defineProperty?

值得注意的,这不像传统的常量。这将仅允许您定义一个常量 (非固定对象) 的属性。这不会生成错误,而且即使返回您尝试设置的值。它只是不能写入值。

我最近阅读了该尝试赋给属性与writable: false如果正在解释执行分配的代码在严格模式下,ECMAScript 5 实际上引发错误。只是另一个理由编写'use strict'到您的代码。

实际上,您可以省略writable: false,因为它是默认值.

内容来源于Stack Overflow Are there constants in JavaScript?
请输入您的翻译

Are there constants in JavaScript?

确认取消