const声明的“不可修改”指变量绑定不可重新赋值,而非值绝对不变;它仅禁止变量指向新地址,允许修改引用类型内部属性,且必须立即初始化、存在块级作用域和暂时性死区。

const 声明的“不可修改”,不是指值绝对不变,而是指变量绑定(binding)不可重新赋值。理解这一点,才能避免常见误区。
const 禁止的是重新赋值,不是禁止内容变化
const 保证的是变量标识符始终指向同一个内存地址,但该地址所存的数据是否可变,取决于数据类型:
- 基本类型(string/number/boolean/null/undefined/symbol):值直接存在栈中,不可变。一旦声明,值就固定了。
- 引用类型(object/array/function):变量存的是指向堆内存的地址。const 不阻止你修改对象内部属性或数组元素,只阻止你把变量指向另一个新对象。
例如:
// ✅ 允许:修改对象属性
const user = { name: 'Alice' };
user.name = 'Bob'; // 没问题,user 还是指向原对象
// ❌ 报错:试图重新赋值整个变量
user = { name: 'Charlie' }; // Assignment to constant variable
块级作用域是 const 生效的前提
const 和 let 一样,只在声明它的 {} 内有效。超出这个范围,变量就不可访问——不是“被清空”,而是根本不存在。
例如:
if (true) {
const flag = true;
console.log(flag); // ✅ 输出 true
}
console.log(flag); // ❌ ReferenceError: flag is not defined
这意味着,const 的“不可修改”只在它存活的作用域内起约束作用;作用域一结束,变量自动销毁,谈不上改不改。
声明必须立即初始化,否则语法报错
const 要求声明和赋值一步完成,没有“先声明后赋值”的空间。这是强制你明确初始状态的设计。
-
✅ 正确:
const PI = 3.14159; -
❌ 错误:
const PI;→ 报错 Missing initializer in const declaration
这个限制也强化了“常量即确定值”的语义,避免出现未定义状态。
暂时性死区(TDZ)让 const 更安全
在 const 声明语句执行前,变量处于暂时性死区。哪怕代码位置在声明之后(比如函数体内提前调用),只要逻辑上没执行到声明行,访问就会报错。
例如:
function test() {
console.log(x); // ❌ ReferenceError
const x = 10;
}
这种机制杜绝了“读取未初始化的 const 变量”这种模糊状态,比 var 的 undefined 更严格、更可预测。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











