JavaScript const
JavaScript 在 ES6 (2015) 中引入了 const 关键字声明常量变量。用 const 定义的变量是一个常量值,不能重新声明、不能重新赋值并且具有作用域。
JavaScript 在 ES6 (2015) 中引入了 const
关键字声明常量变量。用 const
定义的变量是一个常量值,不能重新声明、不能重新赋值并且具有作用域。
声明时必须赋值
JavaScript 的 const
变量在声明时必须赋值(初始化)。
正确的用法:
const PI = 3.14159265359;
不正确的用法:
const PI;
PI = 3.14159265359;
上述代码在浏览器中会报错,提示信息因浏览器而异:
- 谷歌浏览器 chrome: Uncaught SyntaxError: Missing initializer in const declaration
- 火狐 Firefox: Uncaught SyntaxError: missing = in const declaration
什么时候使用 const?
使用 const
声明的变量是不可变更的,称之为常量。作为一般规则,除非知道变量的值会改变,否则始终使用 const
声明变量。
除非有特殊目的,否则当声明下列对象时使用 const
:
- 数组 Array
- 对象
- 函数
- 正则表达式
- Map
- Set
使用 const
声明一个数组或者一个对象的变量,不是说这个对象或者数组不能修改,而是说这个变量不能再被赋值为其他数组或对象或值。但是你可以对数组或者对象本身进行操作,比如在数组中增加或者删除元素,修改对象的属性值等。
常量数组
您可以更改常量数组的元素:
// 定义一个常量数组
const men = ["张三", "李四", "王五"];
// 改变某个元素的值
men[0] = "张大";
// 给数组添加一个元素
men.push("赵六");
但是您不能重新分配数组:
// 定义一个常量数组
const men = ["张三", "李四", "王五"];
men = ["李四", "王五"]; // 错误,不能重复赋值
常量对象
您可以更改常量对象的属性:
// 创建一个常量对象
const man = { name: "张三", age: 30 };
// 修改对象的属性值
man.age = 28;
// 给对象添加一个属性
car.height = 165;
但是您不能重新分配对象:
const man = { name: "张三", age: 30 };
car = { name: "李四", age: 30 }; // 错误,不能重复赋值
块作用域
const
变量的作用域与 let
一样,都是局限在当前块之内。
在本例中,在块中声明的 x 与在块外声明的 x 不同:
const x = 10;
console.log("x =", x); // 输出: x = 10
{
const x = 2;
console.log("x =", x); // 输出: x = 2
}
console.log("x =", x); // 输出: x = 10
您可以在JavaScript Scope一章中了解有关块作用域的更多信息。
重新声明
允许使用 var
在程序中的任何地方重新声明 JavaScript 变量。
var x = 2; // 正确
var x = 3; // 正确
x = 4; // 正确
不允许在同一块作用域范围内将现有 var
或 let
变量重新声明为 const
:
var x = 2; // 正确
const x = 2; // 错误
{
let x = 2; // 正确
const x = 2; // 错误
}
{
const x = 2; // 正确
const x = 2; // 错误
}
const
变量不允许在同一范围内重新赋值:
const x = 2; // 正确
x = 2; // 错误
var x = 2; // 错误
let x = 2; // 错误
const x = 2; // 错误
{
const x = 2; // 正确
x = 2; // 错误
var x = 2; // 错误
let x = 2; // 错误
const x = 2; // 错误
}
允许在另一个作用域或另一个块中使用 const
重新声明变量:
const x = 2; // 正确
{
const x = 3; // 正确
}
{
const x = 4; // 正确
}
浏览器支持
Internet Explorer 10 或更早版本不支持 const
关键字。
下表定义了完全支持 const
关键字的第一个浏览器版本:
Chrome | IE / Edge | Firefox | Safari | Opera |
---|---|---|---|---|
Chrome 49 | IE 11 / Edge | Firefox 36 | Safari 10 | Opera 36 |
Mar, 2016 | Oct, 2013 | Feb, 2015 | Sep, 2016 | Mar, 2016 |