如果你刚开始学 JavaScript,脑子里是不是也冒出过这样的问号:
- “为啥声明变量有三种写法?”
- “为啥 const 明明是常量,还能改?”
- “为啥我用 var 写的变量会莫名其妙跑出来?”
今天我们就来解决这些「变量三兄弟」之间的江湖恩怨。
🧙♂️ var:江湖老大哥,脾气有点怪
var name = "老王";
console.log(name); // 老王
✅ 好处:
- 使用简单,几乎所有 JS 环境都支持(ES3 开始就有)。
❌ 但是:
-
可以重复声明,不会报错
var name = "张三";
var name = "李四";
console.log(name); // 李四 -
变量提升:你以为你没声明,其实 JS 已经声明了
console.log(age); // undefined(不是报错哦)
var age = 30; -
没有块级作用域
if (true) {
var a = 10;
}
console.log(a); // 10
🕶️ let:新时代打工人,规矩但灵活
let city = "宁波";
console.log(city); // 宁波
✅ 优点:
- 有块级作用域(大括号包起来的地方就是它的世界)
- 不允许重复声明(更安全)
❗注意:
- 有“变量提升”,但不能在声明前使用(暂时性死区)
console.log(food); // ❌ 报错
let food = "火锅";
🧊 const:自带冷漠气质的“铁头娃”
const PI = 3.14;
✅ 特性:
- 必须立即赋值
- 不能重新赋值
❗注意:对象属性可改,数组元素也能动
const obj = { name: "小猫" };
obj.name = "小狗"; // ✅
const list = [1, 2, 3];
list.push(4); // ✅
🧪 实战演练
function test() {
if (true) {
var a = 1;
let b = 2;
const c = 3;
}
console.log(a); // 1
console.log(b); // ReferenceError
console.log(c); // ReferenceError
}
🎯 小结
| 特性 | var | let | const |
|---|---|---|---|
| 块级作用域 | ❌ | ✅ | ✅ |
| 可重复声明 | ✅ | ❌ | ❌ |
| 可修改 | ✅ | ✅ | ❌(指针) |
| 推荐场景 | 不推荐 | 一般变量 | 常量 |
🧠 你可能会问
Q:为什么 const 明明是常量,里面的对象还能变?
因为 const 限制的是“变量不能指向别的东西”,而不是“变量指向的内容不能改”。
🧩 小测验
-
以下代码哪个会报错?
var x = 10;
let x = 20; -
以下代码输出是什么?
{
let a = 100;
}
console.log(a);