const

常量是块级作用域, 很像使用 let 语句定义的变量。常量的值不能通过重新赋值来改变,并且不能重新声明。

 

语法

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  

浏览器兼容性

Feature Chrome Edge Firefox (Gecko) Internet Explorer Opera Safari
Basic support 21 (Yes) 36 (36) 11 12 5.1
Reassignment fails 20 (Yes) 13 (13) 11 ? ?
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support ? (Yes) ? ? (Yes) ?
Reassignment fails ? (Yes) ? ? (Yes) ?

兼容性说明

在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").

相关链接

文档标签和贡献者