const声明的是不可重新赋值的绑定,必须初始化;对基本类型真正不可变,对引用类型仅锁定引用地址,内部属性仍可修改,需object.freeze()实现浅冻结。

const 声明的不是“不可变的值”,而是“不可重新赋值的绑定”——这是理解其行为的关键。
const 声明后必须立即初始化
使用 const 声明变量时,**必须在声明时赋值**,否则会报语法错误(SyntaxError)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ✅ 正确:
const PI = 3.14159; - ❌ 错误:
const PI;→ 报错 “Missing initializer in const declaration”
const 绑定不可重新赋值,但值本身可能可变
const 阻止的是对变量标识符的**重新赋值操作**(即不能用 = 再指向另一个内存地址),但不保证所指向的值是“完全不可变”的。
- 对于基本类型(
string、number、boolean、symbol、bigint、null、undefined),值直接存于栈中,因此表现上“真正不可变”:const name = "Alice";<br> name = "Bob"; // TypeError: Assignment to constant variable. - 对于引用类型(
object、array、function、Map、Set等),变量存储的是指向堆内存的引用,const 只锁定这个引用地址不变,但对象内部属性仍可修改:const user = { age: 25 };<br> user.age = 26; // ✅ 允许 —— 修改属性,未改变 user 的引用<br> user = { age: 27 }; // ❌ 报错 —— 试图重新赋值引用
冻结对象才能实现深层不可变性
若需让对象及其嵌套属性也不被修改,需配合 Object.freeze()(浅冻结)或更严格的方案(如 deepFreeze 或使用不可变库)。
- ✅ 浅冻结示例:
const config = Object.freeze({ host: "api.example.com", timeout: 5000 });<br> config.timeout = 10000; // 无效(严格模式下报 TypeError)<br> config.newKey = "test"; // 无效 - ⚠️ 注意:
Object.freeze()不递归冻结嵌套对象:const data = Object.freeze({ meta: { version: "1.0" } });<br> data.meta.version = "2.0"; // ✅ 仍可修改 —— meta 对象未被冻结
常见误用与注意事项
- 不能在块级作用域外访问:const 是块级作用域,和 let 一样,不存在变量提升(Temporal Dead Zone),在声明前访问会报 ReferenceError。
- 不能重复声明:同一作用域内不能用 const(或 let)重复声明同名变量,但 var 可以(不推荐)。
-
for 循环中慎用 const 配合函数闭包:在
for (const i of arr)中没问题;但在传统for (var i = 0; ...)中用 const 声明循环变量会报错,因为每次迭代都会尝试“重新赋值” const 变量(而 for...of / for...in 是安全的)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










