正在加载...

总结与下一步

本页不增加新语法。它把整门课收成一份订单:饮品 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
  • 下一页是待办列表