const声明必须同时初始化,因其语义是“绑定不可变”,即标识符与值的关联从诞生起必须确定;若允许先声明后赋值,将违背“常量即确定”的前提,故JavaScript解析阶段直接报错。

const 声明必须同时初始化,不是语法上的“不方便”,而是设计上对变量意图的强制表达——它要你从第一行就明确:这个值从诞生起就是固定的。
为什么不能先声明、后赋值?
因为 const 的核心语义是“绑定不可变”,即变量标识符(identifier)与某个值之间的关联一旦建立,就永远不能指向另一个值。如果允许 const x; 这样的空声明,就等于预留了一个“将来可能被赋值”的缝隙,违背了“常量即确定”的前提。JavaScript 在解析阶段就会报 SyntaxError: Missing initializer in const declaration,不给运行时留机会。
和 let、var 的关键区别在哪?
let 和 var 支持“声明—初始化分离”,本质是因为它们允许后续重新赋值;而 const 从根上拒绝重绑定,所以必须一步到位:
-
let count;→ 合法,后续可写count = 10; -
var name;→ 合法,变量提升后初始值为undefined -
const PI;→ 直接报错,解析失败,代码无法执行
初始化必须是“真实值”,不能是占位符
初始化不是走形式,而是确立不可动摇的起点。哪怕值来自计算、函数调用或解构,只要在声明那一行完成赋值,就算合规:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
-
const now = Date.now();✅ -
const [a, b] = [1, 2];✅(解构即初始化) -
const config = fetchConfig();✅(只要 fetchConfig() 立即返回值) -
const user;❌(无值,语法错误)
注意:不可修改 ≠ 不可变对象
const 保证的是“引用不变”,不是“内容不可变”。比如:
-
const arr = [1, 2]; arr.push(3);→ 合法,数组内容可变 -
const obj = { x: 1 }; obj.x = 2;→ 合法,对象属性可改 -
arr = [4, 5];或obj = {};→ 报 TypeError: Assignment to constant variable
真正需要内容不可变时,得配合 Object.freeze() 或使用不可变数据结构。

















