let 和 const 的区别:变量声明的正确姿势

let 和 const 的区别:变量声明的正确姿势

在写 JavaScript 代码时,声明变量是每天都会做的事。以前大家习惯用 var,现在 let 和 const 成了主流。但很多人还是分不清什么时候该用哪个,甚至混着用,结果埋下一些不容易发现的坑。

let 可以重新赋值,const 不行

最明显的区别就是能不能被重新赋值。用 let 声明的变量,后面可以改;用 const 声明的,一旦赋值就不能再变了。

let name = '小明';
name = '小红'; // 合法,没问题

const age = 25;
age = 30; // 报错!Cannot assign to constant variable.

这就像你租房签合同,let 是可以中途换人住的,const 则从一开始就定死是谁住,不能换。

const 并不意味着“完全不能变”

很多人以为 const 声明的就是“常量”,永远不能动。其实它只是禁止重新赋值,但如果是对象或数组,里面的属性或元素还是可以改的。

const user = { name: '张三', age: 28 };
user.name = '李四'; // 没问题
user.age = 30;       // 也没问题

// 但这样就会报错
user = { name: '王五' }; // Assignment to constant variable.

所以 const 保护的是变量绑定,而不是值本身。想让对象彻底不变,得靠 Object.freeze() 或其他手段。

声明后必须立即赋值

const 声明变量时就必须给值,不能像 let 那样先声明后赋值。

let score;
score = 95; // 合法

const total; // 报错!Missing initializer in const declaration
total = 100;

这就像办银行卡,let 允许你先开户再存钱,const 必须开户的同时就存一笔钱进去。

块级作用域表现一致

let 和 const 都是块级作用域,和 var 的函数作用域不同。它们只在 {} 内有效,外面访问不到。

if (true) {
    let a = 1;
    const b = 2;
}
console.log(a); // ReferenceError
console.log(b); // ReferenceError

这点上它们行为一样,都比 var 更安全,避免了变量提升带来的意外。

实际开发中怎么选?

一个简单原则:默认用 const,除非你明确知道这个变量后面要改,那就用 let。

比如循环计数器肯定要变,就用 let:

for (let i = 0; i < 10; i++) {
    console.log(i);
}

而配置项、DOM 元素引用这些不会变的,一律用 const:

const API_URL = 'https://api.example.com';
const submitBtn = document.getElementById('submit');

这样代码读起来更清楚,别人一看就知道哪些是固定的,哪些是动态的。

现在很多团队的代码规范都强制优先使用 const,也是为了减少意外修改带来的 bug。