语法
const name1 = value1 [, name2 = value2 [, ... [, nameN = valueN]]];
nameN
- 常量名称,可以是任意合法的identifier(标识符)。
valueN
- 常量值,可以是任意合法的表达式。
描述
这个声明创建了一个常量,可以在全局作用域或者函数内声明常量,常量需要被初始化。这就是说,在定义常量的同时必须初始化(这是有意义的,鉴于常量的值在初始化后就不能改变)。
常量拥有块作用域,和使用let
定义的变量十分相似。常量的值不能通过再赋值改变,也不能再次声明。
一个常量不能和它所在作用域内的其他变量或函数拥有相同的名称。
例子
下面的例子演示了常量的特性。在浏览器的控制台试一下这个例子。
// 注意: 常量在声明的时候可以使用大小写,但通常情况下全部用大写字母。 // 定义常量MY_FAV并赋值7 const MY_FAV = 7; // 报错 MY_FAV = 20; // 输出 7 console.log("my favorite number is: " + MY_FAV); // 尝试重新声明会报错 const MY_FAV = 20; // MY_FAV 保留给上面的常量,这个操作会失败 var MY_FAV = 20; // 也会报错 let MY_FAV = 20;
// 注意块范围的性质很重要 if (MY_FAV === 7) { // 没问题,并且创建了一个块作用域变量 MY_FAV // (works equally well with let to declare a block scoped non const variable) let MY_FAV = 20; // MY_FAV 现在为 20 console.log('my favorite number is ' + MY_FAV); // 这被提升到全局上下文并引发错误 var MY_FAV = 20; }
// MY_FAV 依旧为7 console.log("my favorite number is " + MY_FAV); // 常量要求一个初始值 const FOO; // SyntaxError: missing = in const declaration // 常量可以定义成对象 const MY_OBJECT = {"key": "value"}; // 重写对象和上面一样会失败 MY_OBJECT = {"OTHER_KEY": "value"}; // 对象属性并不在保护的范围内,下面这个声明会成功执行 MY_OBJECT.key = "otherValue";
// 也可以用来定义数组 const MY_ARRAY = []; // It's possible to push items into the array // 可以向数组填充数据 MY_ARRAY.push('A'); // ["A"] // 但是,将一个新数组赋给变量会引发错误 MY_ARRAY = ['B']
规范
Specification | Status | Comment |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262) Let and Const Declarations | Standard | Initial definition. |
ECMAScript Latest Draft (ECMA-262) Let and Const Declarations | Living Standard |
浏览器兼容性
兼容性说明
在Firefox和Chrome更早期的版本,Safari 5.1.7和Opera 12.00,如果使用const定义一个变量,这个变量的值仍然可以修改。IE6-10 不支持 const,但是IE11支持。
Firefox-specific notes
在常量被列出ECMAScript 2015 (ES6)标准很久之前,火狐就已经支持常量。 const
ES6 请参照 bug 950547 and bug 611388.
- 从 Gecko 36开始 (Firefox 36 / Thunderbird 36 / SeaMonkey 2.33):
{const a=1};a
出现ReferenceError
且由于作用域不在返回1 .const a;
现在会出现SyntaxError语法错误
("missing = in const declaration"
): 必须有一个初始值.const a = 1; a = 2;
现在会出现SyntaxError
语法错误 ("invalid assignment to const a").