优先使用const,需重赋值时用let,基本不用var;const声明即初始化且不可再赋值,let具块级作用域和暂时性死区,var因函数作用域和变量提升易引发bug。

日常开发中,优先用 const,需要重新赋值时改用 let,基本不用 var。这不是教条,而是由三者底层行为差异决定的——作用域、提升机制、可变性都不同,选错容易引发隐蔽 bug。
const:默认首选,声明即初始化,不可再赋值
只要变量值不会被重新赋值,就该用 const。它强制你思考“这个值是不是真的会变”,还能避免意外修改。
- 必须在声明时赋值,否则报错:
const x;→ Missing initializer in const declaration - 基础类型(string/number/boolean)赋值后不可改;对象和数组本身可修改属性或元素,但不能重新指向新引用
- 常见适用场景:API 地址、配置项、DOM 元素引用、函数表达式、导入的模块
let:需要后续重新赋值,且作用域需受控
当变量值会在运行中变化(比如循环计数器、条件分支中的临时结果),又不希望它“逃出”当前代码块,就用 let。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 有块级作用域,
if、for、{}内声明,外部访问不到 - 存在暂时性死区(TDZ):声明前访问直接报错,比
var的undefined更安全 - 禁止重复声明,包括不能和同作用域的
var或const同名
var:基本淘汰,仅限极少数兼容或特殊场景
var 的函数作用域和变量提升特性,在现代开发中几乎全是隐患,已不推荐主动使用。
立即学习“Java免费学习笔记(深入)”;
- 块级结构(如
if、for)内声明会“泄漏”到整个函数,易造成污染或覆盖 - 声明提升但赋值不提升,导致
console.log(a)输出undefined而非报错,掩盖逻辑错误 - 允许重复声明,可能掩盖拼写错误或作用域误判
- 仅在需显式挂载到全局对象(如
window.xxx)或维护超老环境兼容时才考虑
一个直观对比示例
看这段代码就能看出区别:
if (true) {
var a = 1;
let b = 2;
const c = 3;
}
console.log(a); // 1 —— var 溢出
console.log(b); // ReferenceError —— let 被限制
console.log(c); // ReferenceError —— const 同样被限制

















