变量就是贴了标签的小箱子,程序靠它把东西记在内存里。先点按钮试试"存进去"和"换掉",再看 let/const 到底怎么选。
电脑的内存(存储空间)就像一排储物柜。你想存东西,就申请一个带标签的小箱子,把东西放进去,以后靠标签上的名字拿。
对应关系超好记:数据=物品,变量=小箱子,内存=储物柜,变量名=箱子上的标签。你只要喊标签上的名字(比如 userName),电脑就知道去哪个箱子拿。
// 声明:跟电脑说"给我一个叫 num 的箱子"(此时箱子是空的) var num; // 赋值:把东西放进去(= 就是"把右边的东西塞进左边的箱子") num = 123; // 初始化:一边要箱子一边就放东西(推荐写法) var num = 123; // 重新赋值:把旧东西拿出来,换新的,以最后一次为准 num = 666; console.log(num); // 666(旧的 123 被冲掉了)
老早以前只有 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。