const限制变量绑定而非值内容,故可修改对象属性或数组元素;let和const均有TDZ,访问前会报ReferenceError;推荐默认用const,仅需重赋值时用let。

const 声明后不能重新赋值,let 可以;但两者都只在块级作用域有效,且都不能重复声明。
为什么 const 声明对象后还能改属性?
因为 const 限制的是「变量绑定」,不是「值的内容」。只要不把变量指向新地址,内部修改完全合法。
-
const obj = { name: 'Alice' };✅ 合法 -
obj.name = 'Bob';✅ 合法(修改属性) -
obj = {};❌ 报错:TypeError: Assignment to constant variable -
const arr = [1, 2]; arr.push(3);✅ 合法(修改数组内容) -
arr = [];❌ 报错
let 和 const 都有暂时性死区(TDZ),但表现不同
在声明语句之前访问 let 或 const 变量,都会触发 ReferenceError,而不是返回 undefined。这是和 var 最关键的行为差异。
console.log(a); // ReferenceError: Cannot access 'a' before initialization let a = 1; console.log(b); // ReferenceError: Cannot access 'b' before initialization const b = 2;
- 哪怕只是
typeof b,也会报错(var下会返回"undefined") - TDZ 范围从块顶部开始,到声明语句执行完为止
- 函数参数也受 TDZ 影响:如果默认参数引用了后面的参数,会报错
什么时候该用 const,什么时候选 let?
推荐「默认用 const,仅当明确需要重赋值时才换 let」——这能帮你提前发现意外修改、提升代码可读性。
立即学习“Java免费学习笔记(深入)”;
-
for循环计数器、while中变化的索引 → 用let - API 响应数据、配置项、DOM 元素引用、函数返回值 → 优先
const - 声明即赋值,且后续无重新赋值需求 → 必须用
const(const不允许不初始化) - 浏览器兼容性已不是问题:Chrome 49+、Firefox 44+、Safari 11+、Edge 12+ 均支持(截至 2026 年)
最容易被忽略的一点:即使你没写 var,在非严格模式下直接赋值未声明变量(如 x = 1),它仍会挂载到 window 上;而 let 和 const 从根源上杜绝了这种隐式全局污染 —— 这不是语法糖,是作用域模型的根本升级。











