常量声明
🎈引用
在ES6中里也可以使用const语法进行声明。使用const声明的变量会被认为是常量( constant ),意味着它们的值在被设置完成后就不能再被改变。正因为如此,所有的const变量都需要在声明时进行初始化,示例如下:
//有效的常量
const maxItems = 30;
//语法错误:未进行初始化
const username;
maxItems变量被初始化了,因此它的const声明能正常起效。而username变量没有被初始化,导致在试图运行这段代码时抛出了错误。
🍕对比常量声明与 let 声明
常量声明与let声明一样,都是块级声明。这意味着常量在声明它们的语句块外部是无法访问的,并且声明也不会被提升,示例如下:
if (condition){
const maxItems = 30;
//其他代码
}
//maxItems在此处无法访问
此代码中,常量maxItems在if语句内被声明。maxItems在代码块外部无法被访问,因为该语句已结束执行。
与let的另一个相似之处,是const声明会在同一作用域(全局或是函数作用域)内定义一个已有变量时会抛出错误,无论是该变量此前是用var声明的,还是用let声明的。例 如以下代码:
var message = "Hello!";
let age = 25;
//之前变量已经存在,下面二者都会抛出错误
const message ="World!";
const age = 26;
两个const声明都可以单独使用,但在前面添加了var与let声明同变量(或常量)的情况下,二者都会出问题。
尽管有上述相似之处,但let与const之间仍然有个必须牢记的重大区别:试图对之前用const声明的常量进行赋值会抛出错误,无论是在严格模式还是非严格模式下:
const maxItems = 5;
maxItems = 6; // 抛出错误,常量一旦声明初始化之后无法再次被赋值,与let和var之间的区别
与其他语言的常量类似,maxItems变量不能被再次赋值。然而与其他语言不同,JS的常量 如果是一个对象,它所包含的值是可以被修改的。
🎨使用const声明对象
const声明会阻止对于变量绑定与变量自身值的修改,这意味着const声明并不会阻止对变量成员的修改。例如:
const person = {
name : "Nicholas"
};
// 工作正常
person.name = "Greg";
// 抛出错误
person = {
name : "Greg"
};
此处person在初始化时被绑定了带有一个属性的对象。修改person.name是可能的,并不会抛出错误,因为该操作只修改了person对象的成员,而没有修改person的绑定值。当代码试图为person对象自身赋值时(这会改变变量绑定),就会导致错误。const在变量上的微妙工作机制容易导致误解,但只需记住:const阻止的是对于变量绑定的修改,而不阻止对成员值的修改。