← 返回目录

3. 变量与 var / let / const

变量就是贴了标签的小箱子,程序靠它把数据记在内存里。

核心三步:
声明——var/let/const 申请一个箱子
赋值——= 把东西放进去
使用——喊变量名就拿到里面的值

var / let / const 区别:
var——老写法,能重复声明,作用域混乱
let——推荐,不能重复声明,块级作用域
const——常量,声明时必须赋值且不能改

坑:const 声明后改值报错、var 重复声明不报错(隐患)、变量名大小写敏感

3.1 互动演示

在左边输入值,点按钮看小箱子。

3.2 知识点逐条讲解(配合代码)

① 变量 = 贴了标签的小箱子

电脑的内存(存储空间)就像一排储物柜。你想存东西,就申请一个带标签的小箱子,把东西放进去,以后靠标签上的名字拿。

对应关系超好记:数据=物品,变量=小箱子,内存=储物柜,变量名=箱子上的标签。你只要喊标签上的名字(比如 userName),电脑就知道去哪个箱子拿。

// 声明:跟电脑说"给我一个叫 num 的箱子"(此时箱子是空的)
let num;

// 赋值:把东西放进去(= 就是"把右边的东西塞进左边的箱子")
num = 123;

// 初始化:一边要箱子一边就放东西(推荐写法)
let num = 123;

// 重新赋值:把旧东西拿出来,换新的,以最后一次为准
num = 666;

// 666(旧的 123 被冲掉了)
console.log(num);

var / let / const 三兄弟(重点中的重点)

老早以前只有 var 一个箱子。后来大家发现 var 有毛病,于是 ES6 时代新增了 let 和 const 来补锅。日常写代码:会变的用 let,固定不变的用 const,别再用 var

var(老,别用)let(推荐)const(常量)
重复声明同名允许,不报错禁止,报错禁止,报错
能不能先不赋值不能,必须一上来就放东西
小括号块 {} 内独立不独立独立(块级作用域)独立
// let 的规矩:同一个地方不能再起同名的箱子
let c = 1;

// let c = 2;
// 报错!已经有个叫 c 的了,别重名

// const 的规矩:箱子一封好就不许整个换掉
const PI = 3.14;

// PI = 3.15;
// 报错!基本类型就是把东西直接封在箱子里,换东西=换箱子

// 但是!箱子里装的是"对另一个房间的指引"(对象)时:
const obj = { name: "张三" };

// 不报错!指引没换,只是进房间把里面东西换了
obj.name = "李四";

如果你以为 const 就是"里面什么都不能改",那就理解错了。const 锁死的是"箱子上写的那个地址":装的是数字、文字这种"直接封进去"的,就改不了;装的是对象、数组这种"写着另一个房间门牌号"的,门牌号没变,房间里的东西随便换。作业让你把 const 的 goodsBrand 重新赋值,就是为了亲眼看这个报错。

③ 给箱子起名字:规则和规矩

自己起的名字统称标识符(变量名、函数名都算)。硬规则违反就报错,规范则是让人看得懂。

硬规则(违反就报错)例子
只能用字母、数字、下划线 _、$user_name、$price 合法
不能拿数字开头2abc 非法
大小写严格区分app 和 APP 是两个箱子
不能用 JS 自己占的词class、if、for 不能当名字

规范:起个一看就懂的名(别叫 a、b、temp)、主流用小驼峰(myUserName,第一个词小写,后面每个词首字母大写)。注意 my-name 里有横杠,JS 会当成"减号",非法

实战:用在哪 / 常见坑 / 怎么解决

① 可能在什么地方用:用户名用 let 存着;圆周率这种固定值用 const;购物车商品放进数组。

② 常见的问题:const 重新赋值报 TypeError;或者变量名打错一个字母,读出来变 undefined

③ 解决思路:报错写着 Assignment to constant 就改成 let;用之前先 console.log 变量名,看看是不是 undefined

一句话记住:变量=贴标签的小箱子;会变用 let、不变用 const、别用 var;const 锁的是门牌号不是房间里的东西;名字要好懂、小驼峰、不能数字开头

本页重点

API作用参数返回值代码示例
var声明变量(可重复声明、有提升)变量名undefinedlet age = 18;
console.log(age);
let声明块级变量(不可重复声明)变量名undefinedlet age = 18;
console.log(age);
const声明常量(必须赋初值、不可改)变量名 = 值undefinedconst PI = 3.14;
console.log(PI);