const的“不可变”指绑定不可变,即变量与内存地址的关联不可更改;对基本类型值不可变,对引用类型仅地址锁定、内部属性仍可修改。

const 用于声明块级作用域的常量,声明后必须初始化,且不能重新赋值。但它“不可变”指的是**绑定不可变**,不是值本身绝对不可变。
const 声明的基本规则
必须在声明时赋值,否则报错;同一作用域内不能重复声明同名变量;不能用 var 或 let 重复定义已用 const 声明的标识符。
-
✅ 正确:
const PI = 3.14159; -
❌ 错误:
const COUNT;(缺少初始化) -
❌ 错误:
const AGE = 25; AGE = 26;(尝试重新赋值)
const 对基本类型和引用类型的区别
基本类型(如 number、string、boolean)值直接存于栈中,const 确保其值不可变;而引用类型(如 object、array、function)变量存储的是内存地址,const 只锁定该地址,不冻结对象内部属性。
-
数字/字符串安全:
const NAME = "Alice"; NAME = "Bob"; // 报错 -
对象可修改属性:
const user = { name: "Tom" }; user.name = "Jerry"; // ✅ 允许 -
数组可修改元素:
const list = [1, 2]; list.push(3); // ✅ 允许;list = []; // ❌ 报错
需要真正“冻结”对象时怎么办
若需让对象或数组内容也不可变,需配合 Object.freeze() 或递归冻结工具(如 deepFreeze),但注意它只做浅冻结,嵌套对象仍可变。
const config = Object.freeze({ api: "https://api.example.com", timeout: 5000 });config.api = "new"; // 无效(非严格模式下静默失败,严格模式报错)- 深层嵌套对象需手动或用库处理,例如 Lodash 的
_.freezeDeep(非原生)
常见使用场景与建议
适合定义配置项、API 地址、数学常量、DOM 引用等生命周期内不换“指向”的数据。避免用 const 声明后续要整体替换的对象变量。
- ✅ 推荐:
const API_URL = "https://api.example.com/v1"; - ✅ 推荐:
const modal = document.getElementById("myModal");(DOM 引用不变) - ⚠️ 谨慎:
const userData = fetchUser();(若后续需整个替换 userData,应考虑是否真适合 const)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











