优先用const,仅当变量需多次赋值时用let,完全避免var;const声明绑定不可变(基础类型真常量,引用类型可改内容不可换引用),let用于循环计数、条件分支赋值等需重赋值场景,var因函数作用域、变量提升、重复声明易引发bug而被弃用。

优先用 const,仅当变量后续必须重新赋值时才用 let,完全避免 var。
const 的适用场景
const 声明的是“绑定不可变”的变量——不是值绝对不可变,而是该变量名不能再指向新地址。对基础类型(string、number、boolean 等),这等同于真正常量;对引用类型(对象、数组、函数),可修改其内部属性或元素,但不能重新赋值给另一个对象。
- 配置项、API 地址、魔法数字等固定值:const API_URL = 'https://api.example.com';
- DOM 元素引用:const header = document.querySelector('header'); 后续不会写 header = ...
- 对象/数组初始化后只改内容不换引用:const user = { name: 'Alice' }; user.name = 'Bob'; ✅;user = { name: 'Charlie' }; ❌
- 函数定义(尤其箭头函数):const handleClick = () => { ... }; 通常不需要重赋值
let 的适用场景
let 用于声明生命周期内需要**多次赋值**的变量,它提供块级作用域且无变量提升风险,比 var 安全得多。
- for / while 循环计数器:for (let i = 0; i
- 异步流程中的中间状态:let result; fetch('/data').then(res => result = res.json());
- 条件分支中需动态赋不同值:let status; if (loading) status = 'pending'; else if (error) status = 'failed'; else status = 'success';
- 临时计算变量:let total = 0; items.forEach(item => total += item.price);
常见误用与避坑点
很多人混淆“不可变”和“不可修改”。const 不禁止修改对象属性或数组元素,只禁止重新赋值。反过来,用 let 声明一个从不重赋值的变量,既失去代码意图表达,也错过静态检查提示。
- ❌ 错误:let config = { timeout: 5000 }; —— 如果 config 后续没被重新赋值,应改用 const
- ✅ 正确:const config = { timeout: 5000 }; config.timeout = 10000; // 修改属性合法
- ❌ 错误:const arr = [1, 2]; arr = [3, 4]; // 类型错误:Cannot assign to const variable
- ✅ 正确:const arr = [1, 2]; arr.push(3); // 修改内容合法
- ⚠️ 注意:在 if / for 块内用 let 或 const 声明,块外无法访问,这是设计优势,不是 bug
为什么不用 var
var 具有函数作用域、变量提升、允许重复声明三大特性,极易引发隐蔽 bug。例如在循环中用 var 声明 i,所有回调共享同一个 i;又如在声明前读取 var 变量得到 undefined 而非报错,掩盖逻辑错误。现代项目已普遍禁用 var,ESLint 等工具默认报错。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











