常量声明
🎈引用
在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
阻止的是对于变量绑定的修改,而不阻止对成员值的修改。