在JavaScript中,const
是一个关键字,用于声明一个只读的常量。这意味着一旦一个变量被const
声明并初始化,你就不能再给它赋予一个新的值。但是,如果声明的常量是一个对象(例如数组或对象字面量),那么你可以修改这个对象的内部属性或元素。这是因为const
实际上保证的是引用地址的不变,而不是引用内容的不变。
基本用法
const PI = 3.14159;
// PI = 3.14; // 这会抛出错误,因为PI是一个常量
对象和数组
const obj = { key: 'value' };
obj.key = 'new value'; // 这是可以的,因为obj指向的对象内容可以被修改
const arr = [1, 2, 3];
arr.push(4); // 这也是可以的,因为arr指向的数组内容可以被修改
// obj = { anotherKey: 'value' }; // 这会抛出错误,因为obj指向的地址不能改变
// arr = [4, 5, 6]; // 这同样会抛出错误,因为arr指向的地址不能改变
块级作用域
const
声明的变量具有块级作用域,这意味着它们在声明的块或语句(例如if
语句或for
循环)内部是可见的,但在外部是不可见的。
if (true) {
const insideIf = true;
// insideIf 是可见的
}
// insideIf 在这里是不可见的
暂时性死区(Temporal Dead Zone, TDZ)
在声明之前的代码块中,const
声明的变量处于“暂时性死区”,这意味着你不能引用它,否则会抛出一个引用错误。
if (true) {
console.log(declaredButNotAssigned); // 抛出 ReferenceError
const declaredButNotAssigned = true;
}
与let
的区别
const
和let
都是块级作用域的变量声明方式,它们的主要区别在于const
声明的变量是不可重新赋值的,而let
声明的变量是可以重新赋值的。
let letVar = 1;
letVar = 2; // 这是可以的
const constVar = 1;
constVar = 2; // 这会抛出错误
总结
const
在JavaScript中提供了一种声明只读常量的方式,这有助于编写更可靠、更易于理解的代码。然而,需要注意的是,const
并不保证它所引用的对象内容不可变,只是保证了引用地址的不可变。如果你需要确保一个对象的内容不可变,你可能需要采取其他措施,如使用冻结对象(Object.freeze()
)。