常量是块作用域的,非常像变量定义使用
let
关键词。常量值不可以透过重新赋值被改变,也不可以被重新声明。
const name1 = value1 [, name2 = value2 [, ... [, nameN = valueN]]];
nameN
valueN
This declaration creates a constant whose scope can be either global or local to the block in which it is declared. Global constants do
not
become properties of the
window
object, unlike
var
变量。
An initializer for a constant is required. You must specify its value in the same statement in which it's declared. (This makes sense, given that it can't be changed later.)
const
declaration
creates a read-only reference to a value. It does
not
mean the value it holds is immutable—just that the variable identifier cannot be reassigned. For instance, in the case where the content is an object, this means the object's contents (e.g., its properties) can be altered.
All the considerations about the "
temporal dead zone
" apply to both
let
and
const
.
A constant cannot share its name with a function or a variable in the same scope.
Constants can be declared with uppercase or lowercase, but a common convention is to use all-uppercase letters.
// define MY_FAV as a constant and give it the value 7
const MY_FAV = 7;
// this will throw an error - Uncaught TypeError: Assignment to constant variable.
MY_FAV = 20;
// MY_FAV is 7
console.log('my favorite number is: ' + MY_FAV);
// trying to redeclare a constant throws an error
// Uncaught SyntaxError: Identifier 'MY_FAV' has already been declared
const MY_FAV = 20;
// the name MY_FAV is reserved for constant above, so this will fail too
var MY_FAV = 20;
// this throws an error too
let MY_FAV = 20;
It's important to note the nature of block scoping.
if (MY_FAV === 7) {
// this is fine and creates a block scoped MY_FAV variable
// (works equally well with let to declare a block scoped non const variable)
let MY_FAV = 20;
// MY_FAV is now 20
console.log('my favorite number is ' + MY_FAV);
// this gets hoisted into the global context and throws an error
var MY_FAV = 20;
}
// MY_FAV is still 7
console.log('my favorite number is ' + MY_FAV);
// throws an error // Uncaught SyntaxError: Missing initializer in const declaration const FOO;
const also works on objects and arrays.
const MY_OBJECT = {'key': 'value'};
// Attempting to overwrite the object throws an error
// Uncaught TypeError: Assignment to constant variable.
MY_OBJECT = {'OTHER_KEY': 'value'};
// However, object keys are not protected,
// so the following statement is executed without problem
MY_OBJECT.key = 'otherValue'; // Use Object.freeze() to make object immutable
// The same applies to arrays
const MY_ARRAY = [];
// It's possible to push items into the array
MY_ARRAY.push('A'); // ["A"]
// However, assigning a new array to the variable throws an error
// Uncaught TypeError: Assignment to constant variable.
MY_ARRAY = ['B'];
| 规范 |
|---|
|
ECMAScript (ECMA-262)
在该规范中的 Let and Const Declarations 定义。 |
| Desktop | Mobile | Server | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
const
|
Chrome 21 | Edge 12 |
Firefox
36
|
IE 11 | Opera 9 | Safari 5.1 | WebView Android ≤37 | Chrome Android 25 |
Firefox Android
36
|
Opera Android 10.1 | Safari iOS 6 | Samsung Internet Android 1.5 | nodejs 6.0.0 |
完整支持
见实现注意事项。