在写程序时,经常会遇到一些值我们不希望它被修改,比如圆周率 π、配置项、API 地址等。这时候,const 就派上用场了。它用来声明一个“常量”,也就是一旦赋值就不能再改的变量。
const 基本语法
使用 const 很简单,只需要在声明变量时加上这个关键字:
const PI = 3.14159;
const API_URL = "https://api.example.com";
这样定义之后,如果尝试重新赋值,JavaScript 会直接报错:
const MAX_USERS = 100;
MAX_USERS = 150; // 报错:Assignment to constant variable.
必须初始化
和 let、var 不一样,const 声明的变量必须在声明时就赋值,不能留空。
const username; // 报错:Missing initializer in const declaration
这也很合理,毕竟“常量”意味着从诞生起就得有个确定的值。
适用于对象和数组吗?
很多人以为 const 能让对象或数组完全不可变,其实不是。它只是保证变量指向的地址不变,但对象内部的属性或数组元素还是可以改的。
const user = { name: "张三", age: 25 };
user.age = 26; // 合法,可以修改属性
user.email = "zhangsan@example.com"; // 也可以添加新属性
const numbers = [1, 2, 3];
numbers.push(4); // 合法,数组内容可以变
如果你真想让对象完全不可变,得配合 Object.freeze() 使用:
const frozenUser = Object.freeze({ name: "李四", role: "admin" });
frozenUser.role = "user"; // 在严格模式下会报错,否则静默失败
块级作用域特性
const 和 let 一样,都是块级作用域。这意味着在 if、for、{} 里面声明的 const 变量,外面是访问不到的。
if (true) {
const message = "只能在这里用";
console.log(message); // 正常输出
}
console.log(message); // 报错:message is not defined
实际应用场景
在项目开发中,用 const 定义配置项特别常见。比如你写一个天气应用,城市列表和单位设置通常不会变:
const DEFAULT_CITY = "北京";
const TEMPERATURE_UNIT = "C"; // 摄氏度
const SUPPORTED_CITIES = ["北京", "上海", "广州", "深圳"];
这样别人看代码时一眼就知道这些值不该被改动,也避免了不小心被覆盖的问题。
和 let、var 的选择建议
现在主流开发中,推荐优先使用 const,除非你明确知道这个变量后续需要重新赋值,才改用 let。var 基本已经退出历史舞台了。
比如你在循环处理数据,计数器自然用 let:
let count = 0;
for (let i = 0; i < items.length; i++) {
if (items[i].valid) count++;
}
而像 DOM 元素引用这种只获取一次的,就该用 const:
const submitBtn = document.getElementById("submit-btn");