const声明的绑定不可重新赋值,但引用类型内部属性仍可修改;基本类型完全不可变,引用类型需用Object.freeze()浅冻结,且声明时必须初始化。

常量不可变,指的是 const 声明的绑定不可重新赋值,而不是它所指向的数据内容绝对不能变。这个区别很关键,理解不到位容易写出看似安全、实则可被修改的代码。
const 绑定的是内存地址,不是值本身
当你用 const 声明一个基本类型(如数字、字符串、布尔值),它确实完全不可改——因为基本类型值直接存在变量绑定的位置:
-
const PI = 3.14;→ 后续写PI = 3.1416;会报TypeError: Assignment to constant variable - 原因:PI 这个名字永久绑定了那个数字字面量所在的内存位置,不允许再指到别处
引用类型内部属性仍可修改
但若 const 绑定的是对象、数组等引用类型,变量本身仍指向同一个地址,只是该地址里存的数据结构是可变的:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
-
const user = { name: '张三' };→user.name = '李四';✅ 合法 -
user = { name: '王五' };❌ 报错 —— 这是试图把 user 指向新地址 -
const list = [1, 2];→list.push(3);✅ 可以;list = [];❌ 不行
需要真正冻结数据?用 Object.freeze()
如果希望对象连属性修改都被禁止,得手动冻结:
const person = Object.freeze({ age: 25 });-
person.age = 26;→ 在非严格模式下静默失败,严格模式下抛TypeError - 注意:
Object.freeze()是浅冻结,嵌套对象仍可修改,需递归处理或用structuredClone+ 冻结组合
声明时必须初始化,且不能留空
const 的语法强制你在声明那一刻就赋予一个确定的值:
-
const count;→ 直接报SyntaxError: Missing initializer in const declaration - 这避免了“声明了但忘了赋值”导致的隐性 bug,也和“绑定即确定”的语义一致
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










