你能在JavaScript中使用常量变量吗?

37

我在一个网站上读到,你可以像这样在 JavaScript 中创建常量变量:

const x = 20;

但在另一个网站上我读到说你不能这样做。所以现在我很困惑它到底是什么?

另外,在 Visual Studio 2010 中,当我在 JavaScript 文件中写 const 时,它会将其标记并显示语法错误。


答案是 babel - Qwerty
7个回答

40

const 是 ECMAScript Harmony 的一个新特性(连同块级作用域的 let,它们将取代 var 和隐式全局变量)。ECMAScript Harmony 是下一版本 ECMAScript 的一系列想法。

const 也是 ECMAScript 4 的一部分。

ECMAScript 4 从未发布,也永远不会发布,而 ECMAScript Harmony 将在几年后才能发布。因此,您无法可靠地使用它。

有些 ECMAScript 实现或衍生品实现了 const(例如 ActionScript)。还有一些实现将 const 视为 var 的同义词(也就是说,您可以使用 const,但它不会给您任何保护)。

但是,除非您绝对可以保证您的代码只在非常特定的 ECMAScript 衍生品的非常特定的版本上运行,否则最好避免使用它。(这真是太遗憾了,因为 const 和尤其是 let 相对于 var 和隐式全局变量是一个巨大的改进。)


是的,那对我没有任何好处。这很糟糕,JavaScript 应该至少有 const。 - chobo2
这个答案已经过时了。现在有一些转译器,比如babel,可以让你在普通浏览器中使用新的ES功能。 - Qwerty
2
const 不仅仅是用于常量(即“常量值”),它还用于常量绑定 - Mathias Bynens

25

如果你正在寻找一个只读变量,你可以使用类似于下面的代码来模拟:

var constants = new (function() {
    var x = 20;
    this.getX = function() { return x; };
})();

然后像这样使用它

constants.getX()

如果“常量”变量本身被修改了怎么办? - Bharat Khatri
1
@BharatKhatri 如果有人在运行时重新定义你的对象,无论你做什么都没用。 - lincolnk
常量的主要思想是将其值仅占用内存中的一个部分,以便更快地访问,而不是声明多次。但这个解决方案远远无法实现这一点。 - jucardi

6
解决方案是创建一个对象,将所有的常量放入该对象中:
const={};

const.x=20;

const.y=30;

Object.freeze(const);  // finally freeze the object

使用方法:

var z=const.x + const.y;

任何尝试修改这个变量的操作都会产生一个错误:
const.x=100;  <== raises error

3
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

3

在ECMAScript中没有const关键字(不考虑已经死亡的4.0版本和ActionScript)。

const关键字在JScript.NET中可用,并且在一些最近的JS引擎版本,如Firefox、Opera 9和Safari中作为供应商特定的扩展。


嗯,我不确定 Jscript.net 是什么。它能和 jQuery 之类的东西一起使用吗? - chobo2
@chobo2:JScript是微软的JavaScript版本(可能是商标问题)。 JScript.NET是JScript针对.NET框架的扩展,就像C#和VB.NET一样。 我认为您无法在其中使用jQuery,因为JScript.NET从未在浏览器上可用。 - kennytm
const 也可在 Mozilla 实现(Rhino、SpiderMonkey)中使用。 - Christian C. Salvadó
@CMS:啊,好的。已更新。 - kennytm
@CMS 好的,我需要我的网站在所有浏览器上运行。那么其他浏览器也实现了它吗? - chobo2

2

我认为有一些不是使用 var 声明的变量,是全局变量...在 JavaScript 中没有 const。

var a="test"a="test" 是不同的。


1

不,JavaScript 中没有数据类型 "const"。

JavaScript 是一种弱类型语言。每种变量都是用 var 声明的。


9
打字松散与变量绑定的恒定有些不相关,你觉得呢? - pilcrow
1
确实是这样。我的意思是JavaScript中没有特殊的数据类型(如int,string,const)。 - Rajat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接