第 11 周总结:let/const 与解构赋值 — ES6 起航
蜗牛往上爬 · 前端工业可视化学习笔记 第 11 周总结
本周正式进入 ES6 标准学习。let/const 解决了 var 多年的痛点(作用域污染、变量提升陷阱、重复声明),解构赋值让取值代码更优雅。从本周起,我们的代码将全面"现代化"。
目录
一、本周学了什么
知识图谱
let/const 与解构赋值
├── let
│ ├── 块级作用域({} 内有效)
│ ├── TDZ(声明前访问报错)
│ └── 不允许重复声明
│
├── const
│ ├── 声明必须赋值、不可重新赋值
│ ├── 对象/数组内容可以修改(锁地址不锁内容)
│ └── 命名约定:常量用全大写(MAX_TEMP)
│
├── 对比 var
│ ├── var:函数作用域、提升、可重复声明、进 window
│ ├── let/const:块级、TDZ、不可重复、不进 window
│ └── 使用原则:默认 const,要赋值用 let,不用 var
│
├── 数组解构
│ ├── 按位置:let [a, b] = arr
│ ├── 交换:[a, b] = [b, a]
│ ├── 跳过:逗号占位
│ ├── 默认值:右边 undefined 时使用
│ └── rest:...rest 收集剩余
│
├── 对象解构
│ ├── 按属性名(顺序无所谓)
│ ├── 重命名:{ a: x }
│ ├── 默认值、嵌套
│ └── 参数解构:fn({name, temp})
│
└── 综合应用
├── for...of + 解构遍历对象数组
├── rest 参数替代 arguments(真数组)
└── 从 API 对象一次性提取字段(重命名+嵌套+默认值)
二、核心知识速记
三条铁律
默认 const,需要重新赋值用 let,基本不用 var
const 锁地址不锁内容——对象属性、数组元素可以改
解构原则:数组按位置、对象按属性名
关键对比表
高频写法
// 交换变量
[a, b] = [b, a];
// 函数参数解构 + 默认值
function fn({ id, name = "未知" } = {}) {}
// rest 参数求和
const sum = (...nums) => nums.reduce((a, b) => a + b, 0);
// for...of 解构遍历
for (const { id, temp } of deviceList) {}
在工业可视化里的应用场景
三、本周踩过的坑
坑点 1:const 对象内容被"以为"不能改
// ❌ 以为 const 就不能改,导致数据操作卡住
const device = { temp: 65 };
device = { temp: 85 }; // ❌ 报错(换地址)
// ✅ const 允许改内容
const device = { temp: 65 };
device.temp = 85; // ✅ 可以
坑点 2:已声明变量解构忘加括号
// ❌ 开头 { 被当作代码块,语法错误
let x;
{ x } = { x: 1 }; // ❌ SyntaxError
// ✅ 整体加括号
let x;
({ x } = { x: 1 });
坑点 3:解构 null/undefined
// ❌ 解构 null 直接报错,页面崩溃
const data = getData(); // 可能返回 null
const { id } = data; // ❌ TypeError
// ✅ 先判空或用默认值
const { id } = data || {};
// 或者调用处保证 data 不是 null
坑点 4:对象解构用了数组的"位置"思维
// ❌ 以为对象解构按位置
const obj = { id: "A", name: "B" };
const { id, name } = obj; // ✅ 但这是按属性名,不是位置
// ❌ 顺序写反也不行吗?——不,顺序无所谓,名字对就行
const { name, id } = obj; // ✅ 一样能取到
坑点 5:var 的 for 闭包陷阱还在用
// ❌ 用 var,批量绑定事件全是最后一个
for (var i = 0; i < btns.length; i++) {
btns[i].onclick = function () { console.log(i); }; // 全是 length
}
// ✅ 用 let,每个按钮独立
for (let i = 0; i < btns.length; i++) {
btns[i].onclick = function () { console.log(i); }; // 0,1,2...
}
四、自测清单
[ ] let 和 var 的 3 个区别?
[ ] 什么是 TDZ?访问会发生什么?
[ ] const 声明必须做什么?能重新赋值吗?
[ ] const 对象/数组的内容能改吗?为什么?
[ ] for + var 的闭包陷阱是什么?let 如何解决?
[ ] 数组解构的默认值什么时候生效?
[ ] rest 参数和 arguments 有什么区别?
[ ] 对象解构和数组解构的匹配规则分别是什么?
[ ] 对象解构如何重命名?如何加默认值?
[ ] 函数参数解构的标准写法?
[ ] 已声明变量做对象解构为什么要加括号?
[ ] 解构 null 会发生什么?
[ ] 用解构交换两个变量的值?
五、下周预告
第 12 周:函数扩展(箭头函数)与字符串/数组扩展
下周的箭头函数是 ES6 的精髓——代码会从 function (d) { return d.temp } 变成 d => d.temp,简洁不止一倍。展开运算符 ... 也是高频语法。
🚀 第 11 周完成!ES6 的大门已开,下周开始用箭头函数和扩展运算符写"现代 JS"。