总结与下一步
本页不增加新语法。它把整门课收成一份订单:饮品 tea,规格 regular。应当能讲清的那一行是 tea / regular。
这一行从哪里来
无障碍那一页用真正的 button type=button 写下它。Mouse、Enter 和 Space 触发同一次点击。aria-live="polite" 在当前句子之后再读出。若没有 size,button.disabled 为 true,按钮留在页面上。焦点留在按钮上。
更早的两行
调试时在 { drink: "tea", size: "regular" } 上读取了 order.cup。对象有 size,没有 cup。console.error 不会抛出,脚本继续。那一行是 fixed / tea / regular。
throw new Error("missing size") 会在 return 之前停住 label。catch 读取 error.message,内容是 missing size。error.name 是 Error。finally 两条路都会运行。那一行是 caught / missing size。
七行,同一份订单
每一行都是这份订单的一块。只有当结果还觉得薄时,才去打开对应的课。
📊 一门课用一份订单能做什么
| 分组 | 你可以 | 一个结果 |
|---|---|---|
| 值与流程 | 保存值,用 if 选择,走过列表 | tea / regular |
| 函数 | 接收订单并返回一行 | tea / regular |
| 对象与数组 | 读取字段,解析 JSON,复制 | { drink: "tea", size: "regular" } |
| 页面 | 找到按钮并写下这一行 | tea / regular |
| 等待 | 暂停一个异步函数;fetch 得到 Response | response.ok,然后 response.json() |
| 较新语法 | 按名取出,拼出文本,构造类 | tea / regular |
| 留意 | 读取真实属性,有意抛出,留下按钮 | fixed / tea / regular,然后 caught / missing size,然后 tea / regular |
这张表是提醒。它不是第二门课,也没有问题。
值与决定
你保存 tea 和 regular,比较并重复。if 做选择。break 离开循环。continue 跳过一项并继续。
函数
函数返回 tea / regular。箭头函数是更短的函数。closure 在外层函数返回之后仍能看见那个绑定。
对象、JSON 与数组
JSON.parse 把文本变成对象。map 建立新数组。find 返回一个匹配。spread 会复制。rest 会收集没有点名的部分。这份复制是浅的。
页面
querySelector 找到按钮。textContent 写下这一行。setTimeout 稍后才运行,并不取代按钮。
等待
await 只暂停那一个异步函数。页面其余部分继续。异步函数始终返回 Promise。fetch 解析为 Response,不是已解析的正文。response.json() 再返回一个 Promise。HTTP 404 通常不会拒绝 fetch。要查看 response.ok。网络失败可以拒绝。
较新的语法
按名字取出 drink 和 size。缺少的嵌套对象可能抛出。模板字面量在运行时填入 ${...}。模块不在 window 上,并通过 HTTP 加载。子类在 this 之前调用 super。私有字段留在类内部。
订单不对的时候
读取 size,不要读不存在的属性。console.error 不会抛出,下一行仍会运行。throw 停住函数,只有 catch 继续。把动作放在按钮上。焦点轮廓保持可见。
接下来
下一页是一份短待办:添加、标为完成、删除。它仍属于核心路径。
其后可选:strict mode、Map 与 Set、正则表达式、web storage、cookies、类继承。完成核心路径并不需要它们。
把这五行说出来
- 按钮写下 tea / regular,aria-live="polite" 在当前句子之后读出
- console.error 不会抛出;调试那一行是 fixed / tea / regular
- throw new Error("missing size") 在 return 之前停住 label;catch 读到 missing size;那一行是 caught / missing size
- fetch 解析为 Response;在 response.json() 之前查看 response.ok
- 下一页是待办列表