const限制变量绑定而非值内容,故可修改对象属性或数组元素;let和const均有TDZ,访问前会报ReferenceError;推荐默认用const,仅需重赋值时用let。
const 声明后不能重新赋值,let 可以;但两者都只在块级作用域有效,且都不能重复声明。
因为 const 限制的是「变量绑定」,不是「值的内容」。只要不把变量指向新地址,内部修改完全合法。
const obj = { name: 'Alice' }; ✅ 合法obj.name = 'Bob'; ✅ 合法(
修改属性)obj = {}; ❌ 报错:TypeError: Assignment to constant variable
const arr = [1, 2]; arr.push(3); ✅ 合法(修改数组内容)arr = []; ❌ 报错在声明语句之前访问 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")推荐「默认用 const,仅当明确需要重赋值时才换 let」——这能帮你提前发现意外修改、提升代码可读性。
for 循环计数器、while 中变化的索引 → 用 let
const
const(const 不允许不初始化)最容易被忽略的一点:即使你没写 var,在非严格模式下直接赋值未声明变量(如 x = 1),它仍会挂载到 window 上;而 let 和 const 从根源上杜绝了这种隐式全局污染 —— 这不是语法糖,是作用域模型的根本升级。